在树莓派和Ubuntu上配置Qt + OpenCV的交叉编译环境——3. OpenCV的交叉编译(OpenCV4.5.0)
本系列导航
1. 对交叉编译的基本理解
2. Qt的交叉编译(带EGLFS支持)
3. OpenCV的交叉编译(OpenCV4.5.0)
文章目录
前言
完成Qt的交叉编译之后,已经可以把PC端编译好的可执行文件放到树莓派上执行了。这篇博客说的是,如果想要在开发Qt程序的时候调用OpenCV的库,而且仍然需要交叉编译,应该怎么做。
说明:
- 硬件设备
树莓派 Raspberry Pi 4B,镜像版本为2021-01-11-raspios-buster-armhf-full;
PC端的Ubuntu18.04(在VMware 16.0 Pro虚拟机上运行)。 - 软件版本
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
撒花✿✿ヽ(°▽°)ノ✿