前言:交叉编译的OpenCV自带的GUI在ARM开发板上由于GTK的支持问题很难用自身的GUI显示界面,故配合交叉编译QT用于界面的设计和GUI显示,参考了一些微博,做记录及回顾之用,也能让后人少走些弯路,全程都亲测可行。
Host :PC端ubuntu18.04 64位
Target:ARM64开发板 firefly-RK3399 lubuntu18.04 64位
OpenCV版本:3.4.9
QT版本:5.12.2
下载链接:传送门
可以根据自身需要选择相应的版本,笔者这里选择的是3.4.9版本。下载完解压至任意目录,笔者这里选择的是Ubuntu的下载
文件夹。
友善之臂的aarch64-linux-交叉编译器下载链接(关注我即可无需积分下载):传送门
也可以自己用apt-get在Ubuntu下直接安装。
下载完成后解压至任意目录。
添加交叉编译器到系统环境变量:用Vim打开/etc/profile或者/root/.bashrc或者/etc/bash.barhrc在最后一行添加:export PATH = $PATH:/usr/local/arm/······/bin(刚才解压的目录)。然后重启或者source刚才编辑的文件。
测试环境变量是否添加成功:输入:echo $PATH,看输出信息里面是否有刚才配置的路径,有的话继续在任意目录下输入aarch64-linux-gnu-g++ -v
,若有版本信息及具体目录信息则说明安装成功。
终端下直接运行cmake-gui
,若显示Command not found,那就执行以下的命令安装cmake。
sudo apt-get install cmake
sudo apt install cmake-qt-gui
sudo apt-get install libgtk2.0-dev
sudo apt-get install pkg-config
后二者是交叉编译OpenCV所需相关依赖,有的话可以不用装。
安装完成后再次运行cmake-gui
出现如下画面即说明安装成功。
在CMake的GUI中找到刚才解压OpenCV3.4.9的文件夹,作为源码目录,ARM版本的OpenCV3.4.9会生成在如图所示的build
文件夹中,选择完毕后点击Configure.
如图所示选择aarch64-gnu.toolchain.cmake
作为交叉编译的工具链进行配置,这里注意如果在打开cmake-gui未用root权限打开可能会出错,一定要先进入root账户再打开cmake-gui进行如上的操作,加载配置之后应该会出现如下画面。
根据需要选择需要支持的选项,部分可能需要额外的依赖支持,如果想在开发板上正常使用则还需要交叉编译对应的依赖库,点击generate
等待生成,完成后进入OpenCV的源码文件夹下的build文件夹中看看是否生成了Makefile文件,若已经生成则可以进行下一步的编译安装了。
在build文件夹下运行make -j4 && make install
,耐心等待即可完成编译和安装。此时build文件中的install文件夹就是我们交叉编译出来的ARM64版本的OpenCV3.4.9.
Vim /etc/ld.so.conf.d/opencv.conf
,会提示该文件不存在将新建一个新的conf文件,在打开的conf第一行里写上自己第一步解压的opencv的lib地址,如/home/firefly/wangrui/opencv/lib
vim中输入:wq指令保存并退出,随后运行sudo ldconfig
激活生效。
3. 环境变量配置:先将解压的opencv文件中位于/lib/pkgconfig下的opencv.pc进行修改:
# Package Information for pkg-config
prefix=/home/wangrui/下载/opencv-3.4.9/build/install
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 3.4.9
Libs: -L${exec_prefix}/lib -lopencv_dnn -lopencv_highgui -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_videoio -lopencv_imgcodecs -lopencv_features2d -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}
将prefix修改为自己开发板上对应的opencv文件夹的路径如
prefix=/home/firefly/wangrui/opencv
修改完成后保存退出,运行Vim /etc/bash.bashrc
在最后一行添加如下:
PKG_CONFIG_PATH=/home/firefly/wangrui/opencv/lib/pkgconfig:$PKG_CONFIG_PATH
export PKG_CONFIG_PATH
注意将路径替换成自己对应的pkgconfig路径, vim中输入:wq指令保存并退出,随后运行source ~/.bashrc
激活生效。
运行如下指令若出现如下路径输出则说明pkg配置成功。
(base) root@wr:~# pkg-config --libs --cflags opencv
-I/home/wangrui/opencv3.4.9/install/include/opencv -I/home/wangrui/opencv3.4.9/install/include -L/home/wangrui/opencv3.4.9/install/lib -lopencv_dnn -lopencv_highgui -lopencv_ml -lopencv_objdetect -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_videoio -lopencv_imgcodecs -lopencv_features2d -lopencv_video -lopencv_photo -lopencv_imgproc -lopencv_flann -lopencv_core
我们可以在opencv-3.4.9/samples/cpp中OpenCV自带的示例程序中选择任意一个进行交叉编译,如下所示:
(base) root@wr:~/下载/opencv-3.4.9/samples/cpp/example_cmake# ls
CMakeLists.txt example.cpp Makefile
(base) root@wr:~/下载/opencv-3.4.9/samples/cpp/example_cmake# aarch64-linux-g++ example.cpp -I /home/wangrui/下载/opencv-3.4.9/build/install/include/ -L /home/wangrui/下载/opencv-3.4.9/build/install/lib/ -lopencv_calib3d -lopencv_objdetect -lopencv_core -lopencv_photo -lopencv_dnn -lopencv_shape -lopencv_features2d -lopencv_stitching -lopencv_flann -lopencv_superres -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_imgproc -lopencv_videostab -lopencv_ml
其中aarch64-linux-g++
就是第二步中所安装的交叉编译器,若第二步未配置成功,则运行这一步时会提示找不到该命令,上述命令运行完毕后会在当前文件夹下生成一个名为example的可执行文件,这里的-I与-L后面要替换成PC端上对应的opencv的文件夹路径才能正常编译。
若第五步的开发板上的pkg配置没有问题,则也可以选择将example.cpp拷贝到开发板上然后运行如下指令在开发板上实现编译产生开发板上直接可以运行的可执行文件:
root@firefly:/home/firefly/wangrui/opencv# arm-linux-g++ -o example example.cpp `pkg-config --cflags --libs opencv`
随后会在opencv文件夹中生成一个名为example的可执行文件,opencv自带的这个exmaple是一个调用摄像头并显示,所以需要用到GUI但是开发板的gtk并不支持,在Bash里./example
运行时会出现类似如下的错误提示:
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
/home/firefly/wangrui/opencv/modules/highgui/src/window.cpp, line 501
terminate called after throwing an instance of ‘cv::Exception’
这并不代表opencv不可用,可以写一些简单的代码去测试一下opencv无关gui的函数是否可以正常运行,比如创建一个MAT对象并对它进行一些opencv的函数操作,如裁剪、放缩等,然后将结果保存出来进行查看,下面放一个简单的例子供测试opencv核心函数是否可以在RK3399开发板上正常运行:
#include
#include
using namespace cv;
int main(int argc, char** argv )
{
Mat src = Mat::zeros(12,12, CV_8UC3);
Rect rect(src.cols/4, src.rows/4, src.cols/2, src.rows/2);
src=src(rect);
imwrite("test.jpg", src);
printf("创建成功! \n");
waitKey(0);
return 0;
}
运行完之后可以查看该程序的同路径文件夹下是否生成了test.jpg,将其打开查看是否正常创建了MAT对象以及执行了裁剪的功能,若测试成功,则说明opencv的交叉编译已经完成,现在只需要再对QT进行交叉编译,利用QT作为图形界面显示窗口去进行相关gui功能的实现,QT的交叉编译将在下一篇博客中详细介绍。