Friday, December 19, 2008

Building OpenCV on Windows Mobile 6


Open Computer Vision Library (OpenCV) is a computer vision & image processing library widely used in computer vision community. It supports MS Windows, Apple MAC OS X, and linux systems.

Recently, I need to port my marker tracking module on Windows Mobile 6 (WM6) platform, and thus I have to build OpenCV on WM6. I searched articles on the web, but there are not many posts related to this issue. So, I decided to do it on my own. 
Fortunately, OpenCV is written in C language and it is platform-independent except highgui and cvcam. Well, what I need is only cv and cxcore library which are really C codes. 

To build OpenCV on Windows Mobile, we need to modify some of codes. 


1. cxtypes.h

(1) cvRound( double value ) : Leave the code below and comment the others in the function as follows. 


 
//--------------------------------------
  Cv64suf temp;
  temp.f = value + 6755399441055744.0;
  return (int)temp.u;
//--------------------------------------


2. cxerror.cpp : 

An error occurs because  TLS_OUT_OF_INDEXES is not defined. It is defined in the desktop version of windows.h, but not in Windows Mobile. So, I just  borrowed the definition from desktop version of windows.h. 

//--------------------------------------------
// Before

// Error occurs here. 
#if defined WIN32 || defined WIN64
    static DWORD g_TlsIndex = TLS_OUT_OF_INDEXES; 
#else
    static pthread_key_t g_TlsIndex;
#endif

//-------------------------------



//--------------------------------------------
//
After

#define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF) 
   static DWORD g_TlsIndex = TLS_OUT_OF_INDEXES;

//----------------------------------------------


3. cxswitcher.cpp 

Many errors occur in this file. Almost of them seem to be related to IPP. I just commented out the functions that caused errors and left their blank body.  

4. cxmisc.h

Errors come here since the build environment is not defined. Including malloc.h is enough to avoid compile errors. 

//---------------------------------------------------
//
Before

/* get alloca declaration */
#ifdef __GNUC__
#undef alloca
    #define alloca __builtin_alloca
#elif defined WIN32 || defined WIN64
#if defined _MSC_VER || defined __BORLANDC__
    #include "malloc.h" 
#endif
#elif defined HAVE_ALLOCA_H
    #include "alloca.h"
#elif defined HAVE_ALLOCA
    #include "stdlib.h"
#elif
    #error
#endif

//---------------------------------------------------


//---------------------------------------------------
//
After

#include "malloc.h"

//---------------------------------------------------

5. WinMain(..) function

There is a WinMain function for building library in OpenCV source code. just comment it out. We do not need it any more since we already have one in the Windows Mobile project. 


After you modify codes I showed above, create a Windows Mobile library project in your Visual Studio and build OpenCV. The change I made in the source code is not carefully examined what problems they will cause. However, there is no problem until now in my case. I showed a screenshot of a simple OpenCV application executed on the WM6 emulator. Of course, it works well on the device. 

11 comments:

  1. Update : Some functions related to teh system, such as cvGetTickCount(), may not work.

    ReplyDelete
  2. Hi Lee,

    Is there a sample application available for download so we can play with?

    Thank you

    ReplyDelete
  3. Could you provide the project that you made at somewhere?

    ReplyDelete
  4. Hi Wonwoo Lee,
    what about your progress about building open cv for mobiles.

    ReplyDelete
  5. Hello, Anonymous.
    There is not much progress on Windows Mobile because I'm recently working on iPhone. OpenCV works fine on iPhone OS without any modifications.

    ReplyDelete
  6. 안녕하세요?

    OpenCV를 이용해서 윈도우 모바일에 카메라 영상을

    띄우려고 하는 학생입니다. 학교에서 프로젝트를 맡아서

    하고 있는데, 이제 막 배워서 하는 왕초보라 어렵네요.

    비주얼 스튜디오 2008에서 OpenCV 1.0을 이용해서

    코딩을 하려는데, 오류가 납니다. 검색해봐도 모바일로

    OpenCV를 구현하는 사람이 없어서 그런지 안나오네요.

    c:\program files\opencv\cxcore\include\cxtypes.h(212) : error C4235: 비표준 확장 사용 : 이 아키텍처에서는 '__asm' 키워드를 사용할 수 없습니다.
    c:\program files\opencv\cxcore\include\cxtypes.h(214) : error C2065: 'fld' : 선언되지 않은 식별자입니다.
    c:\program files\opencv\cxcore\include\cxtypes.h(214) : error C2146: 구문 오류 : ';'이(가) 'value' 식별자 앞에 없습니다.
    c:\program files\opencv\cxcore\include\cxtypes.h(215) : error C2065: 'fistp' : 선언되지 않은 식별자입니다.
    c:\program files\opencv\cxcore\include\cxtypes.h(215) : error C2146: 구문 오류 : ';'이(가) 't' 식별자 앞에 없습니다.
    c:\program files\opencv\cv\include\cvcompat.h(784) : warning C4819: 현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오.
    빌드 로그가 "file://d:\ex\mobile\mobile\Windows Mobile 6 Professional SDK (ARMV4I)\Debug\BuildLog.htm"에 저장되었습니다.
    mobile - 오류: 5개, 경고: 1개

    이런 오류가 납니다. 어떻게 해야 되는지 알고 계시면

    알려주시면 좋겠습니다. 그럼 부탁드립니다.

    ReplyDelete
  7. This comment has been removed by a blog administrator.

    ReplyDelete
  8. 김수형/
    안녕하세요. 말씀해 주신 내용은 OpenCV 카페에 물어보시면 더 빠른 대답을 얻으실 수 있을 것 같습니다. http://cafe.naver.com/opencv 를 방문해 보세요.

    ReplyDelete
  9. 답변 감사합니다. 찾아보니 비슷한 문제가 있는 분이

    있었네요. 한글로 검색해서 안나왔었네요.

    될지 안될지 모르겠지만, 시도해봐야겠네요.

    근데 블로그가 모두 영어로 되어 있고, 질문하는 사람도

    영어로 글을 남겨서 블로그 주인이 외국인인 줄 알았네요.

    영어를 굉장히 잘하시나봐요? 프로그래밍 실력도

    뛰어나신것 같고. OpenCV카페를 이용하기도 합니다만,

    제가 워낙 모르는게 많아서 그러는데, 가끔씩 질문

    드려도 될까요? 제가 뒤늦게 대학을 들어와서 나이는

    많고, 공부하기가 너무 어려워서요.

    ReplyDelete
  10. 받아서 수정한 opencv 버전이 어떻게 되는지요?
    win32인지, 1.0인지, 2.0인지 ....
    받은 파일명을 알려주세요

    ReplyDelete
  11. @doraq / 잘 기억이 나진 않지만 아마도 1.2 쯤 되지 않았나 생각합니다.

    ReplyDelete