如何把opencv1.10移植到wince/WM。因為如果懂得裁剪opencv,那么就可以在更多設備(PC,手機,開發(fā)板)上玩更多更好玩的算法,因此,移植和裁剪opencv還是很有必要的。我已經(jīng)移植到wince/WM上的opencv1.10工程可以到這里:http://www.pudn.com/downloads270/sourcecode/embed/detail1235697.html,工程只含cv和cvcore這兩個核心項目,highgui與系統(tǒng)粘合度太大,不好移植,遲點會貼出實現(xiàn)部分highgui功能的例子。
本文參考:http://www.computer-vision-software.com/blog/2009/03/running-opencv-facedetect-sample-on-pocket-pc/
接下來,廢話不說,直接把移植cv和cvcore的步驟貼上:
【CVCORE項目】
cxmisc.h, line 125 to
#elif defined WIN32 || defined WIN64 || defined WINCE
cxswitcher.cpp,由于這個文件修改很多,所以建議從尾部往上修改,這樣容易根據(jù)行數(shù)查找。
第六步line 57 to
#if defined WIN32 || defined WIN64 || defined WINCE
第五步 line 90 to
#if defined WIN32 && !defined WIN64 && !defined WINCE
第四步 line 137:
#ifndef WINCE
“HARDWARE\\DESCRIPTION\\SYSTEM\\CentralProcessor\\0\\”,
#else
L”HARDWARE\\DESCRIPTION\\SYSTEM\\CentralProcessor\\0\\”,
#endif
第三步 line 140:
#ifndef WINCE
“~MHz”,
#else
L”~MHz”,
#endif
第二步 line 435:
#ifdef WINCE
size_t origsize = strlen(name) + 1;
WCHAR wname[100];
MultiByteToWideChar(CP_ACP,0,name,origsize,wname,100);
addr = (uchar*)GetProcAddress( plugins[idx].handle, wname );
#else
addr = (uchar*)GetProcAddress( plugins[idx].handle, name );
#endif
第一步 line 600: 。..。..修改方法同line 435
cxerror.cpp line 45 to
#if defined WIN32 || defined WIN64 || defined WINCE
line 92 加入
#define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF)
line with DllMain to
#if defined WIN32 || defined WIN64
BOOL WINAPI DllMain(
#ifdef WINCE
HANDLE
#else
HINSTANCE
#endif
, DWORD fdwReason, LPVOID )
a fragment in cvGuiBoxReport to
sprintf( message, “%s (%s)\nin function %s, %s(%d)\n\n”
“Press \”Abort\” to terminate application.\n”
“Press \”Retry\” to debug (if the app is running under debugger)。\n”
“Press \”Ignore\” to continue (this is not safe)。\n”,
cvErrorStr(code), err_msg ? err_msg : “no description”,
func_name, file, line );
sprintf( title, “OpenCV GUI Error Handler” );
#ifdef WINCE
WCHAR wmsg[2048];
MultiByteToWideChar(CP_ACP,0,title,strlen(message),wmsg,2048);
int answer = MessageBox( NULL, wmsg, L”OpenCV GUI Error Handler”,
MB_ICONERROR|MB_ABORTRETRYIGNORE);
#else
int answer = MessageBox( NULL, message, title,
MB_ICONERROR|MB_ABORTRETRYIGNORE|MB_SYSTEMMODAL );
#endif
cvtypes.h的#include 《emmintrin.h》的宏定義改為:
#if defined WIN32 && (!defined WIN64 || defined EM64T) &&(!defined WINCE)&& \
(_MSC_VER 》= 1400 || defined CV_ICC) \
|| (defined __SSE2__ && defined __GNUC__ && __GNUC__ 》= 4)
【CV工程】
_cvkdtree.hpp的accum_type maxvar = -std::numeric_limits 《 accum_type 》::max(); 加上#undef max
公共問題:
錯誤 131 error LNK2001: 無法解析的外部符號 “const type_info::`vftable‘” (??_7type_info@@6B@)
cvsmooth.obj.
引入Ccrtrtti.lib解決
工程轉換
把原cv和cvcore工程直接轉換為wince (PPC 2003 (ARM V4))的時候,工程--》屬性--》平臺--》把WIN32新建為 PPC 2003,
屬性--》C/C++--》預處理器:
NDEBUG;_WIN32_WCE=$(CEVER);UNDER_CE;$(PLATFORMDEFINES);WINCE;_WINDOWS;_USRDLL;CV_CE_EXPO
RTS;$(ARCHFAM);$(_ARCHFAM_);_UNICODE;UNICODE。
最好把C/C++的優(yōu)化改為最大化速度(/O2),代碼速度優(yōu)先(/Ot)。
總結,移植opencv到wince,概括來說,只需要用宏定義設置好(區(qū)分WINCE和WIN32),以及把字符編碼的轉換搞定了,CV和CVCORE是很容易移植到wince的,同樣道理,也可以移植到其他支持平臺。不過針對運算部分的優(yōu)化,就要靠用戶自己了,OPENCV跨平臺的時候是使用C/C++標準的Math類庫。。。
(審核編輯: 智匯小新)