折腾了许久,终于把opencv给移植到了arm中,也在网上找了许多教程,在自己移植过程中也遇到了许多问题,下面是自己移植的方法,经过测试确实能用。
首先介绍一下环境: 电脑上装的是ubuntu14.04,开发板是Tiny4412,交叉编译器版本是友善之臂公司提供的arm-linux-gcc4.5.1,opencv版本用的是2.0.0。
(这里有一个问题一直没有解决,下载过很多不同版本的opencv,只有2.0.0版本移植成功了,其他更高版本的opencv在编译程序的时候都会出现
"warning: ../../lib/libopencv_core.so, needed by /usr/local/arm/lib/libopencv_highgui.so, not found (try using -rpath or -rpath-link)"
这种问题,看意思是说找不到相应的.so动态库文件,可是该目录下明明已经有了,郁闷,如果有朋友知道这个问题的解决办法麻烦告诉一下,谢谢)
solution: 这个问题可能是因为环境变量中LD_LIBRARY_PATH的问题,需要把LD_LIBRARY_PATH的值设置为.so动态库文件的路径。可以用echo $LD_LIBRARY_PATH查看。
另外,我的交叉编译工具安装目录位于: /opt/FriendlyArm//toolschain/4.5.1.
解压opencv2.0.0后,进入opencv目录,我的目录是:/home/lipengxiang/Opencv/opencv-2.0.0
# cd /home/lipengxiang/Opencv/opencv-2.0.0
下面的命令是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
命令的意思也很好懂,注意一下就是CPPFLAGS= 后面的“-I” 是 i (哎)的大写,还有--prefix 就是opencv的安装目录。
# make
编译的过程中可能会出现一些错误,不要着急,仔细看一下报错的内容,再上网搜一下都很容易解决的。
一般遇到的比较多的问题是 :
Linking CXX executable ../../bin/opencv_createsamples
../../lib/libcxcore.so: undefined reference to `clock_gettime'
../../lib/libcxcore.so: undefined reference to `pthread_key_create'
../../lib/libcxcore.so: undefined reference to `pthread_getspecific'
../../lib/libcxcore.so: undefined reference to `pthread_setspecific'
原因是cmake不认识我定义的arm-linux系统标记,没有加上库pthread和rt的链接选项。
此时需要修改CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread -lrt (有可能还要加上-dl,看具体情况了,最好是加上) 。可以使用命令:# sudo nano CMakeCache.txt
如下图:
#sudo make install
因为要安装到/opt目录下面,所以需要用到sudo命令。 这样的话/opt/arm/opencv 目录下面就会生成很多文件了。到这里opencv的编译和安装过程也就结束了。
#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
注意命令前面是大写的i和小写的l别弄混了。 这里编译程序时需要指定包含的头文件和库的路径,如果编译没有报错说明就没有问题了。下面将编译生成的可执行文件test-arm和动态库文件 libml.so, libcvaux.so, libhighgui.so, libcv.so, libcxcore.so 分别复制到开发板的/usr和/lib 目录中,然后再开发板上运行程序就大功告成了。
(这里从电脑上复制文件到开发板中可以使用命令:scp ,前提是电脑和开发板的网线连接在同一个路由器中,
例如:scp test-arm @192.168.1.102:/usr)
这里还有一个问题,虽然opencv移植到了开发板中,但是运行程序仍然会出现报错:
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 /forlinx/OpenCV-2.3.1/modules/highgui/src/window.cpp, line 275
这个问题是由于开发板中没有可以用于图像显示界面的库,比如GTK等等。可以通过安装GTK或者使用QT来显示图像解决这个问题。