OpenCV移植到IMX6UL平台

1. 移植是什么意思?

一般所接触的OpenCV都是直接在PC电脑上跑,比如python版或C++版的。现在呢把它放到imx6ull(恩智浦推出的一款嵌入式芯片)这个平台上去跑,所以需要修改一下。

2. 移植的一般过程

据我先前所接触的知识,移植一般是一下几个步骤:

  1. 下载源码
  2. 在现有平台上用目标平台的编译器编译源码(交叉编译👈)
  3. 得到可执行文件或一些动态库或其它东西

3. OpenCV的移植过程

3. 1下载源码

正点原子提供的是opencv-3.4.1,然后解压(在我的Ubuntu虚拟机中的~/OpenCV下)。并在同目录下创建buildinstall文件夹。

3.2 搭建编译环境

3.2.1 安装所需工具

安装cmake和cmake-gui,sudo apt-get install cmake cmake-qt-gui cmake-curses-gui

3.2.2 生成makefile文件

进入到build文件夹下面去,执行cmake-gui命令,开始配置OpenCV环境。具体配置参考正点原子的文档,然后配置完后会生成makefile。

先不要急着输入 make。首先在源码目录 opencv-3.4.1/3rdparty/protobuf/src/google/protobuf/stubs/common.cc 这个文件下添加#define HAVE_PTHREAD 宏定义才可以编译的过。具体原因是 HAVE_PTHREAD 宏定义了 pthread 库。

3.3 编译OpenCV源码

进入到build目录,输入make -j 16开始编译。如果出现错误,先删除build目录下的所有文件,然后重新搭建编译环境。编译成功后,输入make install将某些东西安装到install文件夹,最终如下:

4. Qt例程使用OpenCV

正x原x提供的OpenCV Qt例程。将此文件夹(opencvdemo)放到install文件夹下去。至于为什么放到此文件夹下去是因为在工程QOpenCV.pro文件中定义了lib库的路径是在QOpenCV.pro../../lib下(修改成../lib/xxx)。当然你可以通过修改QOpenCV.pro文件中LIBS的值来指定库文件的位置。

**需要注意的一点是:**上图文件中的库是动态库,也就是说把这些文件拷贝到开发板上去后也要满足这样的要求(即QOpenCV这个程序所需的动态库在此文件上一层的上一层的lib文件夹中,否则会报动态库找不到的错误)。

配置好QOpenCV.pro文件后执行

source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

然后执行qmake生成makefile,最后再执行make编译。编译完成后在当前目录生了可执行文件QOpenCV,把它和resource文件夹拷贝到开发板中去。

5. 运行例程

因为在Ubuntu虚拟机上编译正点原子提供的OpenCV Qt例程时用了动态库,所以需要把OpenCV/install/lib下的动态库拷贝到开发板的/lib下去。然后再把例程编译生成后的QOpenCV和resource文件夹拷贝到开发板中去,执行/etc/init.d/psplash.sh关闭原来的桌面应用系统,最后执行./QOpenCV即可(关闭桌面程序后,可执行/opt/qt5.5.1/apps/QDesktop/QDesktop &来重新启动。

报错说明:如果出现动态库找不到,就说明路径不对。因为前面的QOpenCV.pro文件中定义的动态库在../lib中,所以要保证开发板中的lib也在QOpenCV的../lib处。所以我们就可以通过改变QOpenCVresource文件夹的位置来满足动态库在QOpenCV../lib下。

另外,可以参考本站的CMake使用及pcre2这篇文章

赞赏