opencv在fl2440上的移植

http://blog.sina.com.cn/s/blog_6592a07a01019yw6.html


linux2.6.28  arm-linux4.3.2

1.安装opencv2.0
 
下载地址http://sourceforge.net/projects/opencvlibrary/
 解压OpenCV-2.0.0.tar.bz2
  tar xvf OpenCV-2.0.0.tar.bz2

配置
./configure --host=arm-linux --without-carbon --without-quicktime--without-1394libs --without-ffmpeg --without-python --without-swig--without-gtk --enable-static --enable-shared --disable-apps--without-gtk --prefix=/home/opencv_arm--libdir=/home/opencv_arm/lib--includedir=/home/opencv_arm/include

编译
make

安装
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 in2.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-appsCXXFLAGS=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,
                  fromcxalloc.cpp:42:
../../cxcore/include/cxmisc.h:133:6: error: #elif with noexpression
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

配置内核特点使用ARMEABI编译,必须配置这个选项,因为要和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是gnuc库本来就有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,就不会出现segmentationfault错误。编译应用程序改用arm-linux4.3.2 也没问题。

在板子上运行带有opencv的qt程序时会出现以下错误:

./camopencv:/usr/lib/libpng12.so.0: no version information available (requiredby /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加

exportLD_LIBRARY_PATH=/mnt/usrlib4.3.2:$LD_LIBRARY_PATH 

这样问题解决,一切ok。              

你可能感兴趣的:(linux,嵌入式,qt,交叉编译,SEED-DIM3517)