通过近一周的时候终于成功交叉编译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板上打开摄像头并显示出来。