1. 背景简介
1.1 eBox-II简介
eBox-II采用Vortex86 System-On-Chip(SoC)设计和制造。Vortex86 的架构类似于兼容x86 的CEPC架构。eBox-II包括几乎所有桌面电脑的通用接口:VGA,PS/2 Keyboard,PS/2 Mouse,Ethernet, Parallel, Serial, USB, Audio input and output, Microphone input。eBox-II 内部设有支持嵌入式IDE flash 存储器或2.5 吋笔记本硬盘的IDE 设备接口。eBox-II内置AMI BIOS,使用Boot Loader支持DOS、Windows 98、WindowsXP、Windows XP Embedded 和Windows CE的启动。eBox-II 由ICOP Technology Inc.设计制造,更多信息访问公司网站:http://www.icoptech.com。
1.2 OpenCV简介
OpenCV的全称是:Open Source Computer Vision Library。OpenCV于1999年由Intel建立,现在由Willow Garage提供支持。OpenCV是一个基于BSD许可证授权(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。最新版本是2.3。
2. 移植过程
2.1准备工作
首先需要安装Visual Studio 2005,然后到OpenCV China的官方网站[1]下载OpenCV库1.0。由于OpenCV库十分庞大,而且像highgui这样的库与运行环境联系比较密切,移植起来有较大难度,所以我们只选择了其中的两个核心库cvcore和cv进行移植的尝试。
完成上述工作后需要在VS2005中安装供ebox用的SDK,具体的安装方法见清华大学嵌入式系统课程的基础实验指导书,在此不作冗述。新的SDK安装完成后我们新建了一个编译静态库用的工程,开始对cxcore和cv库中的代码进行修改。
2.2修改代码
cxmisc.h,
line 125:
#elif defined WIN32 || defined WIN64 || defined WINCE
cxswitcher.cpp
line 57:
#if defined WIN32 || defined WIN64 || defined WINCE
line 90:
#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:
#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)
_cvkdtree.hpp的accum_type maxvar = -std::numeric_limits < accum_type >::max(); 加上#undef max