安装
make install
在/home/opencv_arm/文件夹下生成三个文件夹
include lib share
lib目录下存放共享库*.so.*
不管移植不移植,在opencv没有和qt结合以前,大家要先写个小例子测试一下。新建test.c文件,代码如下
如果用QT写程序
需在*.pro文件中添加,包含opencv头文件和库文件路径
INCLUDEPATH += /home/opencv_arm/include/opencv
LIBS += -L/home/opencv_arm/lib -lcxcore -lhighgui -lcv
将上面的程序拷贝到板子上,我的目录为 /mnt/opencv_arm
然后添加库文件路径 LD_LIBRARY_PATH=/mnt/opencv_arm/lib:$LD_LIBRARY_PATH
用qt调用opencv写好程序后 ../../qmake make
当arm-linux为4.3.2时, opencv没问题,qt会包很多错,因为我的qtopia4.5是用arm-linux3.4.1移植的,当然会报错。
于是用arm-linux3.4.1 ,qt不会报错,可是opencv2.0会报错,因为opencv2.0只能支持arm-linux4.x以上的版本。否则 报错opencv_arm /include/opencv/cxmat.hpp:102: error: `__exchange_and_add' undeclared
找到cxmat.hpp文件中的找到以下语句 (lines 67-68 in 2.0):
#else #include <bits/atomicity.h>
#if __GNUC__ >= 4
改4 为3,这个错误解决了,还会出现很多其他的错误。根本原因是 opencv2.0得调用4.x以上的版本。于是只好去移植opencv1.0.
2.opencv1.0的移植
http://www.opencv.org.cn/forum/viewtopic.php?t=11314
http://hi.baidu.com/xiangjunzhao/item/ab1ca33b3dfa235d023edc53
linux2.6.28 arm-linux3.4.1
1.安装opencv1.0
下载地址 http://sourceforge.net/projects/opencvlibrary/
./configure --host=arm-linux --without-gtk --without-carbon --without-quicktime --without-1394libs --without-ffmpeg --without-python --without-swig --enable-static --disable-shared --disable-apps CXXFLAGS=arm-linux-g++ CPPFLAGS=-I/usr/include CXXFLAGS=-O2 --prefix=/home/opencvarm1.0
下边是我自己的理解:
CXXFLAGS=-O2 :对编译进行优化//在编译时,尽量用-O2进行优化,否则容易出问题,
make
makeinstall 这样在home/opencvarm1.0 下生成可用文件
如果在make 过程中遇到如下error:
In file included from _cxcore.h:60:0,
from cxalloc.cpp:42:
../../cxcore/include/cxmisc.h:133:6: error: #elif with no expression
make[3]: *** [cxalloc.lo] 错误 1
make[3]: 离开目录“/home/ying/opencv-1.0.0/cxcore/src”
make[2]: *** [all-recursive] 错误 1
make[2]: 离开目录“/home/ying/opencv-1.0.0/cxcore”
make[1]: *** [all-recursive] 错误 1
make[1]: 离开目录“/home/ying/opencv-1.0.0”
make: *** [all] 错误 2
解决办法: . 找到 ./../cxcore/include/cxmisc.h文件的第133行的 #elif 改成 #else
再次执行以上的配置及安装命令
后来发现opencv1.0 不支持v4l2接口,只支持v4l接口,放弃此想法。怎么办,怎们办 ??
3.于是用arm-linux4.3.2移植qt,由于要用4.0以上的编译器,于是重新移植内核2.6.28.
http://blog.csdn.net/yming0221/article/details/6604616
配置内核特点使用ARM EABI编译,必须配置这个选项,因为要和arm-linux4.0 以上兼容。改用4.3.2编译内核(这个不是必须的,3.4.1也可以)。同时加载4.3.2的工具练到板子上,具体如下:
把/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib 加到板子文件系统 /lib下
把/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib 加到板子文件系统 /usr/lib下(至于为什么可了解文件系统的制作,那以上目录下的库文件又是哪来的了。像libc.so.6是gnu c库本来就有glibc是gnu发布的libc库,直接可装,像libpng12.so.0本来没有,就需要自己下载libpng源码交叉编译后拷贝到以上4.3.2目录中(像opencv的移植,qtopia2.2.0的移植就需要这个步骤))。
在用arm-linux4.3.2移植qt5时,运行时会出现segmentation fault 错误,是编译器的事,改用友善之臂arm-linux4.4.3 下载地址:http://www.arm9.net/download.asp,就不会出现segmentation fault错误。编译应用程序改用arm-linux4.3.2 也没问题。
在板子上运行带有opencv的qt程序时会出现以下错误:
./camopencv: /usr/lib/libpng12.so.0: no version information available (required by /mnt/opencv_arm/lib/libhighgui.so.4)
./camopencv: /lib/libc.so.6: version `GLIBC_2.0' not found (required by /usr/lib/libpng12.so.0)
./camopencv: /lib/libc.so.6: version `GLIBC_2.0' not found (required by /usr/lib/libjpeg.so.62)
分析原因:当程序调用libhighgui.so.4需要链接libpng12.so.0,板子上的这个库版本太低(老文件系统上的),并且调用libpng12.so.0 要调用libc.so.6(这个库我已经跟新为新版本,上面讲到了),所以这个库没有GLIBC_2.0接口,解决办法就是将/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib (这个里面有最新的libpng12.so.0, 必须把老的给删掉哦 ) 加到板子文件系统 /usr/lib下,我现在不是这样做的,因为板子空间不够,我现在用的网络文件挂载在/mnt下,在板子的/etc/profile加
export LD_LIBRARY_PATH=/mnt/usrlib4.3.2:$LD_LIBRARY_PATH
这样问题解决,一切ok。