本帖最后由 郎中令2000年 于 2015-12-6 21:45 编辑
上一贴的主要内容是交叉编译出OpenCV2.4.9库。本帖的主要内容是在Ubuntu中,设置好交叉编译OpenCV的编译环境,并将编译好的程序、库文件和显示图片用U盘挂载到OK210开发板,进行图像显示。
硬件平台:Windows7 64 bit + USB摄像头C270 + OK210
软件平台:VMware8.0.2 + Ubuntu12.04 + arm-linux-gcc4.3.2+OpenCV2.4.9
一、配置Ubuntu中OpenCV的交叉编译环境
1.了解pkg-config
在我的第五贴中,已经提到了一些关于pkg-config的用法。简单来说,pkg-config能够把第三方头文件和库文件的位置指出来,给编译器使用。如我们之前使用过的 `pkg-config --cflags --libs opencv` 就是指出了opencv的头文件和库文件位置,位于环境变量/etc/bash.bashrc 下。
因为pkg-config也只是一个命令,所以不是你安装了一个第三方的库,pkg-config就能知道第三方库的头文件和库文件所在的位置。pkg-config命令是通过查询XXX.pc文件而知道这些的。我们所需要做的是,写一个属于自己的库的.pc文件。
但pkg-config又是如何找到所需的.pc文件呢?这就需要用到一个环境变量PKG_CONFIG_PATH了。该环境变量需写明.pc文件的路径,pkg-config命令会读取这个环境变量的内容,这样就知道pc文件了。
.pc文件一般包括5部分内容,分别是:Name、Description、Version、Cflags、Libs。 其中Name对应的内容要和这个pc文件的文件名一致。当然为了书写方便还会加入一些变量,比如前缀变量prefix。下面是一个范本:
- Name: opencv
- Description:OpenCV pc file
- Version: 2.4
- Cflags:-I/usr/local/include
- Libs:-L/usr/local/lib –lxxx –lxxx
2.配置编译环境
在Ubuntu交叉编译出的opencv库文件夹下(楼主的是/usr/local/arm/opencv/下),新建文件夹pkgconfig,在该文件夹下,新建arm-opencv.c。具体执行指令为:
- cd /usr/local/arm/opencv
- sudo mkdir pkgconfig
- sudo chmod 777 pkgconfig
- cd pkgconfig
- sudo mkdir arm-opencv.c
arm-opencv.c的内容如下:- #Package Information for pkg-config
- prefix = /usr/local/arm/opencv
- exec_prefix = ${prefix}
- libdir = ${exec_prefix}/lib
- includedir_old = ${prefix}/include/opencv
- includedir_new = ${prefix}/include
- Name: OK210-opencv
- Description: Open Source Computer Vision Library for ARM
- Version: 2.4.9
- Cflags: -I${includedir_old} -I${includedir_new}
- Libs: -L${exec_prefix}/lib -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_ts -lopencv_video -lopencv_videostab
因为我的之前已经配置好了,所以可以参考我的终端指令路径和arm-opencv.pc内容如下:
3.配置shell
打开/etc/bash.bashrc,将PKG_CONFIG_PATH进行修改。由于之前在Ubuntu中安装OpenCV时候,已经配置过,所以这次是对原来的进行下路径修改。具体操作是把:
- PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
修改为- PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/arm/opencv/pkgconfig
- export PKG_CONFIG_PATH
保存,关闭之后,要执行source /etc/bash.bashrc 指令,使修改立即生效。
4.把/usr/local/arm/opencv/lib/目录下的所有动态库复制到交叉编译工具/usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib/目录下,以防交叉编译时,找不到opencv库文件。指令如下:
- sudo cp /usr/local/arm/opencv/lib/* /usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib/
二、编写例程和交叉编译
本人参考《OpenCV计算机视觉编程攻略(第2版)》一书,编写了简单的打开图片程序,并命名为test.cpp。
- #include
- #include
- #include
- int main() {
- cv::Mat image;
- image= cv::imread("1.bmp");
- if (image.empty()) {
- std::cout << "Error reading image..." << std::endl;
- return 0;
- }
- cv::namedWindow("Original Image");
- cv::imshow("Original Image", image);
- cv::waitKey(0);
- return 0;
为了验证该程序是否可行,我们先使用Ubuntu上的gcc编译器来编译和执行,编译指令为- $ g++ test.cpp -o test `pkg-config --cflags --libs opencv`
显示结果为
可见,该程序可以正确运行。接下来用交叉编译器 arm-linux-gcc4.3.2 进行交叉编译,交叉编译指令为
- $ arm-linux-g++ test.cpp -o test `pkg-config --cflags --libs arm-opencv` -lpthread -lrt -ldl
三、在OK210上挂载和移植opencv
1.把上一篇交叉编译出的opencv库文件(已添加附件,可下载)和这次编译的test二进制文件和1.bmp图片这三部分拷贝进U盘或者SD卡,当然也可以用NFS链接等,本帖选用U盘挂载。
2.把U盘插到OK210开发板,打开超级终端,开发板上电。
4.输入- # mount -t vfat /dev/sda4 /mnt
然后进入/mnt,若是可以查看到U盘的内容,说明挂载成功。如图所示: 5.在终端运行指令
可以查看到运行错误
错误原因是找不到交叉编译库,所以需要我们通过指令把opencv_lib里面所有库文件拷贝到/lib目录下,即
- cp /mnt/opencv_lib/* /lib
然后,再运行指令 # ./test 1.bmp ,可以看到终端显示仍然有误,显示内容如下:
出现这样错误的原因是,OK210开发板对opencv的libopencv_highgui.so库不完全支持,这也验证了我们上一贴最后一部分的猜测,所以需要我们继续移植GTK或者QT,作图像显示。楼主通过对比GTK和QT的移植过程,果断选择移植QT。
不过这样的错误,正是楼主想看到的,因为它意味着opencv交叉编译和移植到OK210已经成功,接下来的工作就是移植QT。
本贴是在网罗大量CSDN博客之后,经大量尝试和实验最后得出的可行方法,对OpenCV2.2之后的版本移植OpenCV理论上是通用的,如果有问题请留言探讨。
最终选出极具参考价值的文献:http://blog.csdn.net/luotuo44/article/details/8958990,分享的同时,也对原作者表示衷心感谢!