Ubuntu18.04交叉编译OpenCV3.4.9和QT5.12.2至ARM64位平台firefly-RK3399(一)

Ubuntu18.04交叉编译OpenCV3.4.9和QT5.12.2至ARM64位平台firefly-RK3399 (一)

前言:交叉编译的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

二、PC端交叉编译OpenCV3.4.9

1.OpenCV源码下载

Ubuntu18.04交叉编译OpenCV3.4.9和QT5.12.2至ARM64位平台firefly-RK3399(一)_第1张图片
下载链接:传送门
可以根据自身需要选择相应的版本,笔者这里选择的是3.4.9版本。下载完解压至任意目录,笔者这里选择的是Ubuntu的下载文件夹。

2.aarch64-linux-交叉编译器下载

友善之臂的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,若有版本信息及具体目录信息则说明安装成功。

3.安装CMake

终端下直接运行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出现如下画面即说明安装成功。
Ubuntu18.04交叉编译OpenCV3.4.9和QT5.12.2至ARM64位平台firefly-RK3399(一)_第2张图片

4.配置CMake交叉编译OpenCV

Ubuntu18.04交叉编译OpenCV3.4.9和QT5.12.2至ARM64位平台firefly-RK3399(一)_第3张图片
在CMake的GUI中找到刚才解压OpenCV3.4.9的文件夹,作为源码目录,ARM版本的OpenCV3.4.9会生成在如图所示的build文件夹中,选择完毕后点击Configure.
Ubuntu18.04交叉编译OpenCV3.4.9和QT5.12.2至ARM64位平台firefly-RK3399(一)_第4张图片Ubuntu18.04交叉编译OpenCV3.4.9和QT5.12.2至ARM64位平台firefly-RK3399(一)_第5张图片如图所示选择aarch64-gnu.toolchain.cmake作为交叉编译的工具链进行配置,这里注意如果在打开cmake-gui未用root权限打开可能会出错,一定要先进入root账户再打开cmake-gui进行如上的操作,加载配置之后应该会出现如下画面。
Ubuntu18.04交叉编译OpenCV3.4.9和QT5.12.2至ARM64位平台firefly-RK3399(一)_第6张图片根据需要选择需要支持的选项,部分可能需要额外的依赖支持,如果想在开发板上正常使用则还需要交叉编译对应的依赖库,点击generate等待生成,完成后进入OpenCV的源码文件夹下的build文件夹中看看是否生成了Makefile文件,若已经生成则可以进行下一步的编译安装了。
在build文件夹下运行make -j4 && make install,耐心等待即可完成编译和安装。此时build文件中的install文件夹就是我们交叉编译出来的ARM64版本的OpenCV3.4.9.

三.RK3399开发板上的部署

  1. 打包拷贝:将上一步得到的install文件夹打包成tar或者tar.gz再拷贝到RK3399开发板的任意目录下,若不打包则拷贝时会提示某些文件无法复制过去,这里选择开发板中的/opt作为它的解压目录,/opt也是一般默认的软件包的安装位置,便于后续的环境变量的配置及日后的维护和查找。
  2. 添加动态库加载路径:运行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

四.实例交叉编译及运行

1.PC端交叉编译可执行程序

我们可以在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的文件夹路径才能正常编译。

2.开发板交叉编译可执行程序

若第五步的开发板上的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的交叉编译将在下一篇博客中详细介绍。

你可能感兴趣的:(嵌入式移植与开发,linux,qt,opencv,交叉编译,嵌入式)