opencv2.0在arm上的移植

环境:

Ubuntu12.04

mini6410开发板

OpenCV-2.0.0

arm-linux-g++ 4.3.2 / arm-linux-gcc 4.3.2

CMake-gui 2.8.0


OpenCV2.0.0交叉编译过程:

1、在usr/local新建文件夹

# mkdir opencv

把下载的OpenCV-2.0.0.tar.bz2解压到 usr/local/opencv 目录下

2、然后在usr/local/opencv  新建一个 opencv-arm 文件夹,作为CMake编译arm版本的工作目录

# mkdir opencv-arm

如下图所示:

opencv2.0在arm上的移植_第1张图片

3、在终端里调出CMake gui界面:

# cmake-gui

按照下图方式选择源码目录和build目录

opencv2.0在arm上的移植_第2张图片

然后点击Configure按钮,保持generator为Unix Makefiles,选择Specify options for cross-compiling,点击Next

按照如下方式配置:

opencv2.0在arm上的移植_第3张图片

注:/usr/local/arm/4.3.2 为交叉编译工具 arm-linux-g++/gcc 的所在包含文件夹(在bin文件夹里面)

然后点击 “Finish” 按钮;

修改默认配置,默认安装目录为/usr/local,但我想对它统一归类,所以我在/usr/local/arm/4.3.2/lib目录下新建了一个opencv文件夹,在Cmake-gui里修改CMAKE_INSTALL_PREFIX变量改为/usr/local/arm/4.3.2/lib/opencv/

opencv2.0在arm上的移植_第4张图片

(另外,如果没有安装tiff图像的支持,请去掉WITH_TIFF)

然后点击Generate按钮生成Makefile;

4、在终端界面中,进入目录/usr/local/opencv/opencv-arm,运行make编译opencv

编译时发现如下错误:
Linking CXX executable ../../bin/opencv_createsamples
../../lib/libcxcore.so: undefined reference to `clock_gettime'
../../lib/libcxcore.so: undefined reference to `pthread_key_create'
../../lib/libcxcore.so: undefined reference to `pthread_getspecific'
../../lib/libcxcore.so: undefined reference to `pthread_setspecific'

原因是cmake不认识我定义的arm-linux系统标记,没有加上库pthread和rt的链接选项

此时需要修改CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread -lrt,如下图:

opencv2.0在arm上的移植_第5张图片

重新make编译,错误消除,编译成功之后的界面如下:

opencv2.0在arm上的移植_第6张图片


5、然后运行make install,将opencv生成的库和头文件安装到目录/usr/local/arm/4.3.2/lib/opencv/,结果如下:

6、把这5个 .so 库文件拷贝到ARM板系统中的 /lib 目录下面


7、写个简单的测试程序,打开摄像头并创建一个窗口显示

[cpp]  view plain copy
  1. // test.cpp  
  2.   
  3. #include <cv.h>  
  4. #include <cxcore.h>  
  5. #include <highgui.h>  
  6.   
  7.   
  8. int main()  
  9. {  
  10.         CvCapture* capture = NULL;  
  11.         IplImage* frame = NULL;  
  12.   
  13.         if( !(capture = cvCaptureFromCAM(-1)))  
  14.         {  
  15.                 fprintf(stderr, "Can not open camera./n");  
  16.                 return -1;  
  17.         }  
  18.   
  19.         cvNamedWindow("video", 1);  
  20.   
  21.         while(frame = cvQueryFrame( capture ) )  
  22.         {  
  23.                 cvShowImage("video", frame);  
  24.         }  
  25.   
  26.         cvDestroyWindow("video");  
  27.         cvReleaseCapture(&capture);  
  28.         return 0;  
  29. }  

 

8、编译链接测试程序


arm-linux-g++ -I /usr/local/arm/lib/opencv/include/opencv -L/ usr/local/arm/lib/opencv/lib -lcv -lcxcore -lhighgui -lpthread -lrt -o test test.cpp

 

9、复制程序到嵌入式系统中运行

首先复制主机/usr/local/arm/lib/opencv/lib/下面的几个.so文件到嵌入式Linux系统的/lib/目录下,再复制我们编译的test到嵌入式系统/opt/myworks/目录下(并确保文件test属性为可执行),如果test可正常运行没有报告缺少库文件,说明我们编译的arm-linux版OpenCV库已经可以正常使用。


你可能感兴趣的:(opencv2.0在arm上的移植)