一、在树莓派和Ubuntu上配置Qt + OpenCV的交叉编译环境——3. OpenCV的交叉编译(OpenCV4.5.0)

在树莓派和Ubuntu上配置Qt + OpenCV的交叉编译环境——3. OpenCV的交叉编译(OpenCV4.5.0)

本系列导航

1. 对交叉编译的基本理解
2. Qt的交叉编译(带EGLFS支持)
3. OpenCV的交叉编译(OpenCV4.5.0)


前言

完成Qt的交叉编译之后,已经可以把PC端编译好的可执行文件放到树莓派上执行了。这篇博客说的是,如果想要在开发Qt程序的时候调用OpenCV的库,而且仍然需要交叉编译,应该怎么做。

说明:

  1. 硬件设备
    树莓派 Raspberry Pi 4B,镜像版本为2021-01-11-raspios-buster-armhf-full;
    PC端的Ubuntu18.04(在VMware 16.0 Pro虚拟机上运行)。
  2. 软件版本
    Qt 5.14.2
    OpenCV4.5.0

一、在PC上准备交叉编译器

因为目标机仍然是树莓派,可以直接用编译Qt的交叉编译器。其下载,环境变量配置详见:2. Qt的交叉编译(带EGLFS支持)中的 二、1. 在PC上下载交叉编译器并配置环境变量
完成交叉编译器的准备之后,你的PC上应该有一个这样的cross-compile-tool文件夹。
在这里插入图片描述
并且,在PC上的terminal输入:

arm-linux-gnueabihf-g++ -v
sudo arm-linux-gnueabihf-g++ -v

都应该有正常的版本信息输出。

二、在PC上安装依赖库

因为博主之前在PC上装过OpenCV(非交叉编译),所以已经装过一些依赖库了,这里还是把之前装过的和新安装的都列出:

更新。

sudo apt update
sudo apt upgrade

安装cmake及其图形化界面(这个是一定要有的)。

sudo apt install cmake
sudo apt install cmake-qt-gui

使64位系统兼容32位系统。

sudo apt install lib32ncurses5 lib32z1  

这些是之前装过的(可能并不需要)。

sudo apt install build-essential 
sudo apt install git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

解决 libjasper-dev 无法安装的问题,Click Me

三、在PC上下载OpenCV源码

下载OpenCV 源码,Click Me,选择需要的版本(我的是OpenCV4.5.0),点击“Sources”下载。
下载opencv_contrib,Click Me,选择与OpenCV相同的版本下载。
下载好并解压后,将opencv_contrib-4.5.0放在opencv-4.5.0-for-raspi的文件夹里面(为了与之前安装的OpenCV区分开,我修改文件夹名为opencv-4.5.0-for-raspi)。

四、在PC上交叉编译OpenCV源码

我的opencv-4.5.0-for-raspi所在路径:~/Work

新建build和install-opencv文件夹。

cd ~/Work/opencv-4.5.0-for-raspi
mkdir build
mkdir install-opencv

进入build文件夹,运行cmake-gui。

cd build
cmake-gui

设置源码目录和build目录,点击Configure。
在这里插入图片描述
在弹出的窗口中选择specify options for cross-compiling,点击Next。
在这里插入图片描述
填写如下。3个路径是之前我们交叉编译工具链的所在路径。
C 是 arm-linux-gnueabihf-gcc 的路径;
C++ 是 arm-linux-gnueabihf-g++ 的路径;
Target Root 是 cross-compile-tool 文件夹的路径(告诉cmake从哪里找交叉编译的工具链)。
填好之后点击Finish。
在这里插入图片描述
在红色区域中:
勾选 BUILD_JPEG、BUILD_PNG;
MAKE_BUILD_TYPE 输入Release;
MAKE_INSTALL_PREFIX 选择我们刚创建的install-opencv目录;
OPENCV_EXTRA_MODULES_PATH 填写opencv_contrib-4.5.0/modules的路径(比如我的是,~/Work/opencv-4.5.0-for-raspi/opencv_contrib-4.5.0/modules)。

然后点击Configure。
处理报错:
问题1
在这里插入图片描述
解决1
编辑cmake/OpenCVDetectCXXCompiler.cmake文件,写入set(CMAKE_SYSTEM_PROCESSOR arm)

问题2
在这里插入图片描述
解决2
这是类似的一串问题,解决方法也类似。
按照提示打开CMakeDownloadLog.txt文件,并做如下操作。
在这里插入图片描述
再点击Configure,Generate。出现 Configure Done 和 Generate Done 并没有红色字体的报错,这一步就可以过了。

修改CmakeCache.txt文件,找到CMAKE_EXE_LINKER_FLAGS:STRING= , 加上-pthread -ldl -lrt,也就是:

CMAKE_EXE_LINKER_FLAGS:STRING=-pthread -ldl -lrt

重新加载。
在这里插入图片描述
点击Configure,Generate。
完成之后,在terminal中继续操作:

cd ~/Work/raspi/opencv-4.5.0-for-raspi/build
make -j4

完成后make install

make install

树莓派上准备好文件夹。

sudo mkdir /usr/local/install-opencv 
sudo chown -R pi:pi /usr/local/install-opencv

把交叉编译好的install-opencv放到树莓派上(IP地址要改成自己的):

cd ~/Work/raspi/opencv-4.5.0-for-raspi/install-opencv
rsync -avz install-opencv pi@192.168.31.188:/usr/local

五、在树莓派上配置环境变量

sudo nano /etc/ld.so.conf.d/opencv.conf

在新建的文件中输入opencv库的路径:

/usr/local/install-opencv/lib

ctrl+o保存文件,回车, ctrl+x 退出nano编辑器。

使得配置立即生效:

sudo ldconfig

六、测试交叉编译

可以用自己的一个调用了opencv库的程序去做交叉编译的测试,在测试之前还需要在Qt Creator中做以下操作(为了方便,假设你的工程叫qt_for_test)。

在qt_for_test.pro中添加交叉编译后opencv库的路径:

INCLUDEPATH += /home/yjx/Work/opencv-4.5.0-for-raspi/install-opencv/include/opencv4
LIBS += /home/yjx/Work/opencv-4.5.0-for-raspi/install-opencv/lib/libopencv*.so

在qt_for_test.pro中告诉Qt把生成的可执行文件放在哪里:

target.path = /home/pi/qt5
INSTALLS += target

!!注意!!
这样不知道为什么无法打开opencv window,比如执行:

cv::namedWindow("image");

会报错:

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 /usr/dev/opencv/modules/highgui/src/window.cpp, line 516 terminate called after throwing an instance of ‘cv::Exception’ what(): /usr/dev/opencv/modules/highgui/src/window.cpp:516: error: (-2) 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 function cvNamedWindow

但是也没关系,毕竟都有Qt了,opencv window用处也不大。

我测试了一个目标检测的简单例子,在PC上编译,在树莓派上完美运行(人脸就打码了,忽略丑丑的界面,毕竟只是test):
在这里插入图片描述

总结

主要参考:
https://blog.csdn.net/tajon1226/article/details/100606316
https://stackoverflow.com/questions/33276917/cross-compiling-to-raspberry-pi-using-qt-and-opencv

撒花✿✿ヽ(°▽°)ノ✿