1. 移植是什么意思?
一般所接触的OpenCV都是直接在PC电脑上跑,比如python版或C++版的。现在呢把它放到imx6ull(恩智浦推出的一款嵌入式芯片)这个平台上去跑,所以需要修改一下。
2. 移植的一般过程
据我先前所接触的知识,移植一般是一下几个步骤:
- 下载源码
- 在现有平台上用目标平台的编译器编译源码(交叉编译👈)
- 得到可执行文件或一些动态库或其它东西
3. OpenCV的移植过程
3. 1下载源码
正点原子提供的是opencv-3.4.1,然后解压(在我的Ubuntu虚拟机中的~/OpenCV下)。并在同目录下创建build,install文件夹。
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
处。所以我们就可以通过改变QOpenCV
和resource
文件夹的位置来满足动态库在QOpenCV
的../lib
下。
另外,可以参考本站的CMake使用及pcre2这篇文章