<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>增强视觉 &#124; 计算机视觉 增强现实 &#187; 移植，porting</title>
	<atom:link href="http://www.cvchina.info/tag/%e7%a7%bb%e6%a4%8d%ef%bc%8cporting/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cvchina.info</link>
	<description>计算机视觉，增强现实最新资讯</description>
	<lastBuildDate>Mon, 06 Feb 2012 06:34:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>OpenCV WinCE/WM移植</title>
		<link>http://www.cvchina.info/2010/07/29/opencv-wince-wm-porting/</link>
		<comments>http://www.cvchina.info/2010/07/29/opencv-wince-wm-porting/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 12:03:06 +0000</pubDate>
		<dc:creator>cvchina</dc:creator>
				<category><![CDATA[新闻]]></category>
		<category><![CDATA[opencv]]></category>
		<category><![CDATA[wince]]></category>
		<category><![CDATA[wm]]></category>
		<category><![CDATA[移植，porting]]></category>

		<guid isPermaLink="false">http://www.cvchina.info/?p=1587</guid>
		<description><![CDATA[首先声明，本文来自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 &#124;&#124; defined WIN64 &#124;&#124; defined WINCE cxswitcher.cpp,由于这个文件修改很多，所以建议从尾部往上修改，这样容易根据行数查找。 第六步line 57 to #if defined WIN32 &#124;&#124; defined WIN64 &#124;&#124; defined WINCE 第五步 line 90 to #if defined WIN32 &#38;&#38; !defined  WIN64 &#38;&#38; !defined WINCE 第四步 line 137： #ifndef WINCE “HARDWARE\\DESCRIPTION\\SYSTEM\\CentralProcessor\\0\\”, #else L”HARDWARE\\DESCRIPTION\\SYSTEM\\CentralProcessor\\0\\”, #endif 第三步 line 140: #ifndef WINCE [...]]]></description>
			<content:encoded><![CDATA[<p><strong>首先声明，本文来自</strong><a href="http://blog.csdn.net/hellogv" target="_blank"><strong>hellogv</strong></a><strong>，很好很强大，可以围观，可以搭讪。</strong></p>
<p>上次写了在C#玩OpenSURF的<a href="http://blog.csdn.net/hellogv/archive/2010/07/04/5712394.aspx">演示</a>，这次就写写如何把opencv1.10移植到wince/<a href="http://www.cvchina.info/tag/wm/" class="st_tag internal_tag" rel="tag" title="标签 wm 下的日志">WM</a>。因为如果懂得裁剪opencv，那么就可以在更多设备（PC，手机，开发板）上玩更多更好玩的算法，因此，移植和裁剪opencv还是很有必要的。我已经移植到wince/WM上的opencv1.10工程可以到这里:<a href="http://www.pudn.com/downloads270/sourcecode/embed/detail1235697.html">http://www.pudn.com/downloads270/sourcecode/embed/detail1235697.html</a>，工程只含cv和cvcore这两个核心项目，highgui与系统粘合度太大，不好移植，迟点会贴出实现部分highgui功能的例子。</p>
<p>本文参考：<a href="http://www.computer-vision-software.com/blog/2009/03/running-opencv-facedetect-sample-on-pocket-pc/">http://www.computer-vision-software.com/blog/2009/03/running-opencv-facedetect-sample-on-pocket-pc/</a></p>
<p>接下来，废话不说，直接把移植cv和cvcore的步骤贴上：</p>
<p><span id="more-1587"></span></p>
<p>【CVCORE项目】<br />
cxmisc.h, line 125 to<br />
#elif defined WIN32 || defined WIN64 || defined <a href="http://www.cvchina.info/tag/wince/" class="st_tag internal_tag" rel="tag" title="标签 wince 下的日志">WINCE</a><br />
cxswitcher.cpp,由于这个文件修改很多，所以建议从尾部往上修改，这样容易根据行数查找。</p>
<p>第六步line 57 to<br />
#if defined WIN32 || defined WIN64 || defined WINCE</p>
<p>第五步 line 90 to<br />
#if defined WIN32 &amp;&amp; !defined  WIN64 &amp;&amp; !defined WINCE</p>
<p>第四步 line 137：</p>
<p>#ifndef WINCE<br />
“HARDWARE\\DESCRIPTION\\SYSTEM\\CentralProcessor\\0\\”,<br />
#else<br />
L”HARDWARE\\DESCRIPTION\\SYSTEM\\CentralProcessor\\0\\”,<br />
#endif</p>
<p>第三步 line 140:</p>
<p>#ifndef WINCE<br />
“~MHz”,<br />
#else<br />
L”~MHz”,<br />
#endif</p>
<p>第二步 line 435:</p>
<p>#ifdef WINCE<br />
size_t origsize = strlen(name) + 1;<br />
WCHAR wname[100];<br />
MultiByteToWideChar(CP_ACP,0,name,origsize,wname,100);<br />
addr = (uchar*)GetProcAddress( plugins[idx].handle, wname );<br />
#else<br />
addr = (uchar*)GetProcAddress( plugins[idx].handle, name );<br />
#endif</p>
<p>第一步 line 600: &#8230;&#8230;修改方法同line 435<br />
cxerror.cpp line 45 to<br />
#if defined WIN32 || defined WIN64 || defined WINCE</p>
<p>line 92 加入</p>
<p>#define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF)</p>
<p>line with DllMain to<br />
#if defined WIN32 || defined WIN64<br />
BOOL WINAPI DllMain(<br />
#ifdef WINCE<br />
HANDLE<br />
#else<br />
HINSTANCE<br />
#endif<br />
, DWORD  fdwReason, LPVOID )</p>
<p>a fragment in cvGuiBoxReport to<br />
sprintf( message, “%s (%s)\nin function %s, %s(%d)\n\n”<br />
“Press \”Abort\” to terminate application.\n”<br />
“Press \”Retry\” to debug (if the app is running under debugger).\n”<br />
“Press \”Ignore\” to continue (this is not safe).\n”,<br />
cvErrorStr(code), err_msg ? err_msg : “no description”,<br />
func_name, file, line );<br />
sprintf( title, “<a href="http://www.cvchina.info/tag/opencv/" class="st_tag internal_tag" rel="tag" title="标签 opencv 下的日志">OpenCV</a> GUI Error Handler” );<br />
#ifdef WINCE<br />
WCHAR wmsg[2048];<br />
MultiByteToWideChar(CP_ACP,0,title,strlen(message),wmsg,2048);<br />
int answer = MessageBox( NULL, wmsg, L”OpenCV GUI Error Handler”,</p>
<p>MB_ICONERROR|MB_ABORTRETRYIGNORE);<br />
#else<br />
int answer = MessageBox( NULL, message, title,</p>
<p>MB_ICONERROR|MB_ABORTRETRYIGNORE|MB_SYSTEMMODAL );<br />
#endif</p>
<p>cvtypes.h的#include &lt;emmintrin.h&gt;的宏定义改为：</p>
<p>#if defined WIN32 &amp;&amp; (!defined WIN64 || defined EM64T) &amp;&amp;(!defined WINCE)&amp;&amp; \<br />
(_MSC_VER &gt;= 1400 || defined CV_ICC) \<br />
|| (defined __SSE2__ &amp;&amp; defined __GNUC__ &amp;&amp; __GNUC__ &gt;= 4)</p>
<p>【CV工程】<br />
_cvkdtree.hpp的accum_type maxvar = -std::numeric_limits &lt; accum_type &gt;::max(); 加上#undef max</p>
<p><strong>公共问题：</strong><br />
错误 131 error LNK2001: 无法解析的外部符号 &#8220;const type_info::`vftable&#8217;&#8221; (<a href="mailto:??_7type_info@@6B">??_7type_info@@6B</a>@)</p>
<p>cvsmooth.obj.<br />
引入Ccrtrtti.lib解决</p>
<p><strong>工程转换</strong></p>
<p>把原cv和cvcore工程直接转换为wince （PPC 2003 （ARM V4））的时候，工程&#8211;&gt;属性&#8211;&gt;平台&#8211;&gt;把WIN32新建为 PPC 2003，<br />
属性&#8211;&gt;C/C++&#8211;&gt;预处理器：<br />
NDEBUG;_WIN32_WCE=$(CEVER);UNDER_CE;$(PLATFORMDEFINES);WINCE;_WINDOWS;_USRDLL;CV_CE_EXPO</p>
<p>RTS;$(ARCHFAM);$(_ARCHFAM_);_UNICODE;UNICODE。</p>
<p>最好把C/C++的优化改为最大化速度(/O2)，代码速度优先(/Ot)。</p>
<p>总结，移植opencv到wince，概括来说，只需要用宏定义设置好（区分WINCE和WIN32），以及把字符编码的转换搞定了，CV和CVCORE是很容易移植到wince的，同样道理，也可以移植到其他支持平台。不过针对运算部分的优化，就要靠用户自己了，OPENCV跨平台的时候是使用C/C++标准的Math类库。。。</p>

	Tags: <a href="http://www.cvchina.info/tag/opencv/" title="opencv" rel="tag">opencv</a>, <a href="http://www.cvchina.info/tag/wince/" title="wince" rel="tag">wince</a>, <a href="http://www.cvchina.info/tag/wm/" title="wm" rel="tag">wm</a>, <a href="http://www.cvchina.info/category/news/" title="新闻" rel="tag">新闻</a>, <a href="http://www.cvchina.info/tag/%e7%a7%bb%e6%a4%8d%ef%bc%8cporting/" title="移植，porting" rel="tag">移植，porting</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.cvchina.info/2010/07/29/opencv-wince-wm-porting/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

