首页 > 新闻 > OpenCV WinCE/WM移植

OpenCV WinCE/WM移植

2010年7月29日 cvchina 发表评论 阅读评论

首先声明,本文来自hellogv,很好很强大,可以围观,可以搭讪。

上次写了在C#玩OpenSURF的演示,这次就写写如何把opencv1.10移植到wince/WM。因为如果懂得裁剪opencv,那么就可以在更多设备(PC,手机,开发板)上玩更多更好玩的算法,因此,移植和裁剪opencv还是很有必要的。我已经移植到wince/WM上的opencv1.10工程可以到这里:http://www.pudn.com/downloads270/sourcecode/embed/detail1235697.html,工程只含cv和cvcore这两个核心项目,highgui与系统粘合度太大,不好移植,迟点会贴出实现部分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,由于这个文件修改很多,所以建议从尾部往上修改,这样容易根据行数查找。

第六步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++的优化改为最大化速度(/O2),代码速度优先(/Ot)。

总结,移植opencv到wince,概括来说,只需要用宏定义设置好(区分WINCE和WIN32),以及把字符编码的转换搞定了,CV和CVCORE是很容易移植到wince的,同样道理,也可以移植到其他支持平台。不过针对运算部分的优化,就要靠用户自己了,OPENCV跨平台的时候是使用C/C++标准的Math类库。。。

Related posts

分类: 新闻 标签: , , ,
  1. zzl
    2010年7月29日20:59 | #1

    不知道winCE支不支持COM组件,没接触过,如果支持,就很美了,甚至可以远程调用

    最近在尝试把openCV的部分功能改写到COM框架下

    COM的想法很美,不过看得我好晕。。。

  2. kongxd
    2010年8月5日14:02 | #2

    好人啊,真正实用的东西!难点就是HIGHGUI,这个很麻烦,想要完整功能估计要靠opencv3.0了。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.