在线问答
直播中

郎中令2000年

10年用户 88经验值
擅长:嵌入式技术 模拟技术 控制/MCU
私信 关注

【OK210试用体验】之(七)—— 交叉编译和移植OpenCV 2.4.9 (2)

本帖最后由 郎中令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。下面是一个范本:

  1. Name: opencv
  2. Description:OpenCV pc file
  3. Version: 2.4
  4. Cflags:-I/usr/local/include
  5. Libs:-L/usr/local/lib –lxxx –lxxx

    2.配置编译环境

    在Ubuntu交叉编译出的opencv库文件夹下(楼主的是/usr/local/arm/opencv/下),新建文件夹pkgconfig,在该文件夹下,新建arm-opencv.c。具体执行指令为:

  1. cd /usr/local/arm/opencv
  2. sudo mkdir pkgconfig
  3. sudo chmod 777 pkgconfig
  4. cd pkgconfig
  5. sudo mkdir arm-opencv.c

    arm-opencv.c的内容如下:
  1. #Package Information for pkg-config

  2. prefix = /usr/local/arm/opencv
  3. exec_prefix = ${prefix}
  4. libdir = ${exec_prefix}/lib
  5. includedir_old = ${prefix}/include/opencv
  6. includedir_new = ${prefix}/include

  7. Name: OK210-opencv
  8. Description: Open Source Computer Vision Library for ARM
  9. Version: 2.4.9
  10. Cflags: -I${includedir_old} -I${includedir_new}
  11. 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内容如下:

2015-12-06_150218.jpg

    3.配置shell

    打开/etc/bash.bashrc,将PKG_CONFIG_PATH进行修改。由于之前在Ubuntu中安装OpenCV时候,已经配置过,所以这次是对原来的进行下路径修改。具体操作是把:

  1. PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
    修改为
  1. PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/arm/opencv/pkgconfig
  2. 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库文件。指令如下:

  1. sudo cp /usr/local/arm/opencv/lib/* /usr/local/arm/4.3.2/arm-none-linux-gnueabi/lib/

    二、编写例程和交叉编译

    本人参考《OpenCV计算机视觉编程攻略(第2版)》一书,编写了简单的打开图片程序,并命名为test.cpp


  1. #include

  2. #include
  3. #include

  4. int main() {

  5.   cv::Mat image;

  6.   image=  cv::imread("1.bmp");

  7.   if (image.empty()) {  
  8.       std::cout << "Error reading image..." << std::endl;
  9.       return 0;
  10.   }

  11.   cv::namedWindow("Original Image");
  12.   cv::imshow("Original Image", image);

  13.   cv::waitKey(0);
  14.   return 0;
    为了验证该程序是否可行,我们先使用Ubuntu上的gcc编译器来编译和执行,编译指令为
  1. $ g++ test.cpp -o test `pkg-config --cflags --libs opencv`
   显示结果为

2015-12-06_164138.jpg

    可见,该程序可以正确运行。接下来用交叉编译器 arm-linux-gcc4.3.2 进行交叉编译,交叉编译指令为

  1. $ arm-linux-g++ test.cpp -o test `pkg-config --cflags --libs arm-opencv` -lpthread -lrt -ldl
2015-12-06_165356.jpg

    三、在OK210上挂载和移植opencv

    1.把上一篇交叉编译出的opencv库文件(已添加附件,可下载)和这次编译的test二进制文件和1.bmp图片这三部分拷贝进U盘或者SD卡,当然也可以用NFS链接等,本帖选用U盘挂载

    2.把U盘插到OK210开发板,打开超级终端,开发板上电。

    3.在超级终端输入
  1. # fdisk -l /dev/sda
   可以查看U盘挂载盘符和格式。

    4.输入
  1. # mount -t vfat /dev/sda4 /mnt
   然后
进入/mnt,若是可以查看到U盘的内容,说明挂载成功。如图所示:
2015-12-06_202034.jpg

    5.在终端运行指令

  1. # ./test 1.bmp
    可以查看到运行错误

2015-12-06_204516.jpg

   错误原因是找不到交叉编译库,所以需要我们通过指令把opencv_lib里面所有库文件拷贝到/lib目录下,即

  1. cp /mnt/opencv_lib/* /lib
然后,再运行指令 # ./test 1.bmp ,可以看到终端显示仍然有误,显示内容如下:

2015-12-06_205248.jpg

    出现这样错误的原因是,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,分享的同时,也对原作者表示衷心感谢!

回帖(13)

栾新科

2015-12-21 15:21:36
终于有时间开始更新了,再接再励
举报

tluyk

2016-1-6 16:13:30
和楼主用的工具一样,都是4.3.2交叉编译器,opencv2.4.9,移植过后出现segmentation fault,即使main里面啥都不写,只要用包含交叉编译库也会出现这样的情况,不知为何...
举报

郎中令2000年

2016-1-7 17:56:46
引用: tluyk 发表于 2016-1-6 16:13
和楼主用的工具一样,都是4.3.2交叉编译器,opencv2.4.9,移植过后出现segmentation fault,即使main里面啥都不写,只要用包含交叉编译库也会出现这样的情况,不知为何...

你的错误我没有遇到过,不知道你用的是什么板子,还有Linux开发环境是什么。这两篇帖子都是我认真验证后才发表的,对里面的每一个实验步骤都可以绝对负责。建议不要灰心,也可以参考下我附带的参考文献,再认真做一遍。祝你成功!
举报

wdadmin

2016-1-10 13:15:02
楼主,你好!
           首先,感谢你将自己的经验分享出来,其次,有个问题想问你,我移植了opencv2.4.9到ARM开发板,但是编写了一个测试程序运行,出现和你文中相同的错误提示,编译GTK+,网上查到,你在文中提到,选择安装QT,可以解决该问题,但我的开发板已经移植了QT库,请问具体应该怎么解决这个问题?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分