Linux下交叉编译OpenCv

 

 

通过近一周的时候终于成功交叉编译opencv成功了,真心不容易。有一句话乃真理也,凡事贵在坚持。过程总是痛苦的,因为不懂得很多问题但是又需要面对很多问题,最大的收获就是耐心解决所有问题后就懂得这些了。

 

         1.为什么要交叉编译opencv?

         之前比较天真,以为在Ubuntu上安装好opencv后,如果gcc通过编译,那么就直接arm-linux-g++嘛,事实证明我真的很天真。

         之所以要交叉编译opencv,是因为在编译的时候,gcc和arm-linux-gcc所需要调用的库是不一样的,尽管名字是一样的。至于为什么,我猜应该是编译出来的可执行文件是在不同环境下运行的,所以编译的时候要链接的库当然不能是一样的。

         2.为什么选择opencv2.3.1

         说实话挺艰辛的,从opencv2.4.10到opencv2.4.9再到opencv1.0,这三个版本都未能成功交叉编译,后来只好继续尝试,终于在第四个版本opencv2.3.1成功了。贵在坚持。

        

 

一、开发环境

 

宿主机Ubuntu12.04

交叉编译器:arm-linux-gcc4.5.1(友善之臂)

cmake-2.8.7-Linux-i386.sh

 

二、编译opencv

 

1.解压

         解压opencv2.3.1到任意目录下,我的压缩包本来放在/home/ljy-linux/下,直接解压

         #tar jxvf OpenCV-2.3.1a.tar.bz

 

2.进入源目录并修改

         为什么要修改,因为安装的时候会出错所以直接先修改了

         修改OpenCV-2.3.1/modules/flann/include/opencv2/flann/dist.h文件第63行的源码:将absl()修改为abs()

         #cd OpenCV-2.3.1/modules/flann/include/opencv2/flann/

         #vi dist.h

         修改完之后保存

 

3.运行cmake-gui

         运行之前先建两个目录

         #cd /usr/local

#mkdir arm

         #mkdir opencv-arm

         目录arm用来安装opencv,opencv-arm则作为交叉编译的工作目录

#cmake-gui

        

选择源代码目录:/home/ljy-linux/OpenCV-2.3.1

选择Build目录:/usr/local/opencv-arm/

点击Configure,保持generator为Unix Makefiles,选择Specify options for cross-compiling,点击Next
Operating System填写arm-inux
C Compilers填写/usr/local/arm/FriendlyARM/4.5.1/bin/arm-linux-gcc
C++ Compilers填写/usr/local/arm/ FriendlyARM/4.5.1/bin/arm-linux-g++
程序库的Target Root填写/usr/local/arm/ FriendlyARM/4.5.1/,然后点击Finish

修改默认配置,默认安装目录为/usr/local,把CMAKE_INSTALL_PREFIX变量改为/usr/local/arm/
去掉WITH_TIFF(如果不需要的话一定要勾选掉)

再次点击Configure

然后点击Generate生成Makefile

 

4.编译和安装

         编译之前,修改一下CMakeCache.txt。

         #cd  /usr/local/opencv-arm

         #vi CMakeCache.txt

         CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread -lrt

         开始编译

         #make

         完全编译完成后安装

         #make install

        

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

         // test.cpp

 

#include <cv.h>

#include <cxcore.h>

#include <highgui.h>

 

 

int main()

{

        CvCapture* capture = NULL;

        IplImage* frame = NULL;

 

        if( !(capture = cvCaptureFromCAM(-1)))

        {

                fprintf(stderr, "Can not open camera./n");

                return -1;

        }

 

        cvNamedWindow("video", 1);

 

        while(frame = cvQueryFrame( capture ) )

        {

                cvShowImage("video", frame);

        }

 

        cvDestroyWindow("video");

        cvReleaseCapture(&capture);

        return 0;

}

 

6.编译连接测试程序

 

         arm-linux-g++ -I /usr/local/arm/include/opencv/ -L /usr/local/arm/lib//libopencv_imgproc.so -L /usr/local/arm/lib//libopencv_core.so -L /usr/local/arm/lib//libopencv_flann.so  -L /usr/local/arm/lib//libopencv_highgui.so  -L /usr/local/arm/lib//libopencv_ml.so -lpthread -lrt -o test test.cpp

 

         似乎有些警告,先忽略了。

7.放到arm上运行

 

  放到板上运行之前要先把之前编译好的库文件放到板子上面。

  原本是在板子上面创建同样的路径,后来发现运行不了,提示找不到库文件,后来想想直接把lib下的所有.so文件放到了根目录的/lib下,再次运行,成功了。

  类似的,应该只要把编译好的库文件一起放在arm板上的系统库文件中就可以了。

8.成功只是一半的

 

  运行是成功的,编译好了的库也被成功调用了,但是arm板提示说缺少界面的创建,大概就是这个意思,所以还需要一些界面来打开窗口等等,可以使用qt等。因为友善之臂arm板的界面是用qt写的,所以接下来学习一下qt的编程然后加上OpenCv再在arm板上打开摄像头并显示出来。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。