首页 > 代码库 > opencv在arm和x86上的移植
opencv在arm和x86上的移植
一、开发环境
操作系统:fedora14
Opencv版本:2.0
Qt版本:4.7
arm:mini6410
交叉编译工具:arm-linux-gcc-4.5.1
二、安装与配置
Linux系统的安装,交叉Qt-creator的安装还有交叉编译工具的安装,网上说的基本都没什么问题,测试后都可以用。这里安装Qt-Creator遇到了一点小问题,按照网上的和mini6410开发手册上的安装方法太复杂了,用QtSdk-offline-linux-x86-v1.2.1.run安装方便又准确。
这篇文章重点还是将如何安装Opencv到linux下,并且配置Opencv到QT中,并实现在x86和arm平台上能够顺利运行qt+Opencv的GUI程序。为将来做嵌入式模式识别搭建一个快速方便的平台。
小编这里提出自己的问题,希望有缘人如果解决了能够联系我,开始我是安装的Opencv2.4.2版本,安装完成后,编写简单的Opencv程序进行交叉编译,但总是编译不通过(这里的安装参考的文库:http://wenku.baidu.com/link?url=Wj9y2srglzlvSkGN2m6Yyg89VU9yM16akMcx18lXO8ii8YA6klOaxfeq1zsaY4QNilqJZogvb6YTA6iJ0NiDP6yYnGe9ICQPQS_ThXNCNlm)
移植opencv2.4.2编译arm程序时
arm-linux-g++ -o opencv_test opencv_test.cpp -I /usr/local/arm/opencv/include/opencv -L /usr/local/arm/opencv/lib -lopencv_core -lopencv_highgui
出现如下错误:
/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/bin/ld: warning: ../../lib/libcxcore.so, needed by /usr/local/arm/opencv-2.1/lib/libcv.so, not found (try using -rpath or -rpath-link)
/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/bin/ld: warning: ../../lib/libcv.so, needed by /usr/local/arm/opencv-2.1/lib/libcvaux.so, not found (try using -rpath or -rpath-link)
/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/bin/ld: warning: ../../lib/libhighgui.so, needed by /usr/local/arm/opencv-2.1/lib/libcvaux.so, not found (try using -rpath or -rpath-link)
/usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/../../../../arm-none-linux-gnueabi/bin/ld: warning: ../../lib/libml.so, needed by /usr/local/arm/opencv-2.1/lib/libcvaux.so, not found (try using -rpath or -rpath-link)
读了这边作者的博文:http://blog.csdn.net/yanzi1225627/article/details/7524698,发现他遇到的和我类似的问题,且尝试了多种方式也没能解决,最终我也和他一样走向了放弃Opencv2.4.2的道路,转向Opencv2.0。其中也尝试了他提供的解决方法,并参考博文:http://blog.sina.com.cn/s/blog_602f87700100nyda.html
在交叉编译中LFLAGS即-L换成-Wl,-rpath-link -Wl,发现这个问题是不见了,但是尽然出现了找不到.so的库文件,我也无语了,这在之前已经解决的问题又回来了,拷贝了库也设置了路径,老问题又出现了,被打回十年前的感觉很痛苦。arm-none-linux-gnueabi缺少这样的库,拷贝过去就行了,发现不行,且这篇文库尼玛是复制的之前好几个博主的文章,原文不动,都不知道有没有试过。没办法只能放弃Opencv2.4.2了。
下面就专心讲讲安装Opencv2.0与遇到的一些问题。
这里的安装我是参考的Opencv中文网(这网站发现很靠谱)
http://wiki.opencv.org.cn/index.php/%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91
Opencv2.0下载地址:
1、解压文件:
#tar zxvf opencv-2.0.0.tar.gz
#cd opencv-2.0.0
2、检查软件配置
#./configure --host=arm-linux --without-gtk --without-carbon --without-quicktime --without-1394libs --without-ffmpeg --without-python --without-swig --enable-static --enable-shared --disable-apps CXX=arm-linux-g++ CPPFLAGS=-I/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include LDFLAGS=-L/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib --with-v4l2 --prefix=/opt/x86/opencv --libdir=/opt/x86/opencv/lib -includedir=/opt/x86/opencv/include
如果提示有需要的软件未安装,请安装后再运行 ./configure 命令,直到提示"Now run make ..."为止。
备注:opencv2.2中已经省去了configure 文件,可以通过cmake安装,参考http://www.samontab.com/web/2010/04/installing-opencv-2-1-in-ubuntu/
3、编译Opencv
#make
4、安装Opencv
#make install
5、更新动态链接库
用root用户执行下面的操作
添加路径/usr/local/lib到文件/etc/ld.so.conf,然后运行命令
#ldconfig
6、测试安装包(在sample/c下)
g++ `pkg-config opencv --libs --cflags opencv` drawing.c -o drawing
这里会出现找不到路径的问题,具体错误如下:
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc‘
to the PKG_CONFIG_PATH environment variable
No package ‘opencv‘ found
Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc‘
to the PKG_CONFIG_PATH environment variable
No package ‘opencv‘ found
网上有很多解决办法,归结到底就是路径设置问题。
这里我在/root/.bashrc文件中添加如下路径就可以编译了
export PKG_CONFIG_PATH=/opt/x86/opencv/lib/pkgconfig:$PKG_CONFIG_PATH
在此编译测试用例,成功后执行命令:
#./drawing
还可以测试其他用例如:
cd samples/c
chmod +x build_all.sh
./build_all.sh
./facedetect --cascade="/usr/local/share/opencv/haarcascades/haarcascade_frontalface_alt.xml" --scale=1.5 lena.jpg
以上是x86版opencv的配置安装
下面是arm版opencv的配置安装
export PKG_CONFIG_PATH=/opt/arm/opencv/lib/pkgconfig:$PKG_CONFIG_PATH
第一步,configure的配置
./configure --host=arm-linux --without-gtk --without-carbon --without-quicktime --without-1394libs --without-ffmpeg --without-python --without-swig --enable-static --enable-shared --disable-apps CXX=arm-linux-g++ CPPFLAGS=-I/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/include LDFLAGS=-L/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/lib --with-v4l2 --prefix=/opt/arm/opencv --libdir=/opt/arm/opencv/lib -includedir=/opt/arm/opencv/include
第二步,编译
Make
出现了如下错误:
../3rdparty/.libs/lib_clapack.a(dlasyf.o): could not read symbols: File in wrong format
解决方法:删除3rdparty/.libs/lib_clapack.a这个文件,make clean 后重启make编译。
第三步,安装
Make install
安装成功后,在/opt/arm/opencv/lib和/opt/arm/opencv/include目录下会生成很多文件。
第四步,测试
arm-linux-gcc test.c -o test-arm -I/opt/arm/opencv/include/opencv -L/opt/arm/opencv/lib -lml -lcvaux -lhighgui -lcv -lcxcore -lpthread -lrt
移植opencv2.0到arm上运行./show-arm lena.jpg时的错误:
OpenCV Error: Unspecified error (The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Carbon support. If you are on Ubuntu or Debian,
install libgtk2.0-dev and pkg-config, then re-run cmake or configure script) in
cvNamedWindow, file highgui/window.cpp, line 100
这里说明已经可调用opencv库进行算法运算了,只是没有一个gui的平台供使用,下面我尝试用QT作为这个平台来获取视频。
这篇文章的博主:http://blog.csdn.net/noodies/article/details/5798434
在为网友解答的时候说用的是v412做的视频捕捉,然后再用opencv进行图像处理,最后操作framebuffer显示处理结果(我这里没有尝试了,感觉qt应该更方便一些)
这篇文章说是gtk要先于opencv安装:http://lovelittlebean.blog.163.com/blog/static/11658218620125911268437/
我用的fedora14,没有安装过gtk,但是运行
#pkg-config --modversion gtk+-2.0
可以找到我gtk版本。
#pkg-config --cflags --libs gtk+-2.0
可以查看gtk编译和链接的信息
这里参考的“源码安装gtk”博客:http://os.it168.com/a2008/0828/984/000000984646.shtml
搞了这么多都没搞清楚gtk到底是干嘛用的,在下面博文中有提到过
http://blog.csdn.net/yanzi1225627/article/details/7524698
出现gtk等那就对了的字样,但还不知道什么意思,如何解决接着就写到qt的配置去了。于是我就先配置qt,这里的qt配置我参照的博文是:
http://blog.chinaunix.net/uid-24641004-id-3459705.html
后来我知道gtk其实就是一种gui
运行opencv打开摄像头,不知道是这个博主的qt版本不一样还是写漏了,在运行时提示Qdebug运用错误,找到代码F1进入函数文档,发现缺少它的头文件include <QtDebug>,加上就OK了。
还提示.pro不能找到lib**.so的库,进去查看发现配置的时候多了一个空白行,意思就是libs+=的lib库添加多行一定要加“\”,我多了一个空白行。
在运行就出现“error!”
查看代码中这是Qdebug的错误提醒,我直接修改成“error:can not open camero!”。这样就一目了然了。
解决办法当然就是插入摄像头了。
在编译运行,头像出现了
下面就看如何移植到arm上了。
修改.pro为arm版的头文件和库文件编译自己的小程序,这个之前编译生成的,我分别用x86和arm区分开来的。
重新编译,然后拷贝到开发板上运行。
头疼的事情出现了,出现segmentation fault段错误。麻烦了,解决方法博文
http://www.cnblogs.com/s_agapo/archive/2011/11/24/2262346.html
中有提到一点,但是不适合我的程序,他只是先是一张图片将qt自带的load函数换成opencv的loadImage。
最后在博文:
http://blog.csdn.net/yanzi1225627/article/details/8215695
提到的评论中,一个女娃告诉他将capture = cvCreateCameraCapture(-1)中的-1设置成202就ok了,试了下真可以,尽然成功了,到目前也还不知道202代表啥意思。
运行结果如下:
到目前为止,发现基本已经调通了这整个平台的环境搭建。
下面尝试运用了一下他的算法,做了个人脸检测。
也遇到了一些问题如:
编译x86版本的qt程序,运行无问题。但是在编译arm版本的qt程序时,出现错误error: main.o: Relocations in generic ELF (EM: 3)
解决办法:进入工程目录执行make clean,清理一下在编译就ok了。
还出现cvWaitkey(0)的错误,我猜的可能是这个函数在arm平台下确实有点问题吧,我就注释了,因为只是个等待函数,最后运行成功了,但是视频变得有点卡,不像在x86下运行那么顺畅,难道是我注释了cvWaitkey的原因,还要继续优化。
贴上结果图片: