1、环境 

PC端:Ubuntu 16.04 

opencv 版本: 3.4.13

编译器:aarch64-linux-gnu

工具:cmake

2、源码下载

opencv-3.4.13

http://链接:https://pan.baidu.com/s/1YBohe41YuOhBZ2iCIupmLA 提取码:0012 --来自百度网盘超级会员V4的分享

opencv_contrib-3.4.13

http://链接:https://pan.baidu.com/s/1iyOl2QpZstdew5hyxVLlsQ 提取码:0012 --来自百度网盘超级会员V4的分享

3、编译前的准备

全程用 root 用户运行。

(1)安装没有版本号的gcc-aarch64-linux-gnu

apt-get install gcc-aarch64-linux-gnu

 (2) 安装gcc开头的5版本的支持64bit ARM linux的交叉编译工具

apt-get install gcc-5-aarch64-linux-gnu

  (3) 安装没有版本号的g++编译工具    

apt-get install g++-aarch64-linux-gnu

(4) 安装4.9版本号的g++编译工具

apt-get install g++-4.9-aarch64-linux-gnu

(5) 安装cmake

apt-get install cmake

(6)拷贝源码到Ubuntu中,(哪个目录下都行)

rk3588使用opengles显示1080p视频 rk3288 opencv_百度网盘

 (7)在 opencv-3.4-13 下 创建创建两个文件夹,(名字随便指定,一个是编译用的,一个是安装用的)如下 

rk3588使用opengles显示1080p视频 rk3288 opencv_linux_02

 (8)创建完后进入 build文件中,打开cmake

rk3588使用opengles显示1080p视频 rk3288 opencv_2d_03

 (9)cmake参数配置(注意,整个过程要保证Ubuntu能上网,因为编译过程中会自动下载东西)

rk3588使用opengles显示1080p视频 rk3288 opencv_2d_04

 

rk3588使用opengles显示1080p视频 rk3288 opencv_linux_05

 

 

rk3588使用opengles显示1080p视频 rk3288 opencv_linux_06

 

 最后一张图的第二个框中 C  和 C++ 选择前面安装的aarch64-linux-gnu,默认会安装在/usr/bin下,这里注意自己的 aarch64-linux-gnu 安装位置 ,(按照自己的位置来!)

Target root 我也不大懂,随便填的,对编译问题不大 。

(10) 修改配置

修改安装目录。

rk3588使用opengles显示1080p视频 rk3288 opencv_百度网盘_07

 

rk3588使用opengles显示1080p视频 rk3288 opencv_linux_08

 

rk3588使用opengles显示1080p视频 rk3288 opencv_2d_09

指定 opencv_contrib-3.4.13位置

rk3588使用opengles显示1080p视频 rk3288 opencv_linux_10

使能Zlib

rk3588使用opengles显示1080p视频 rk3288 opencv_2d_11

 自此,cmake 参数配置完成。然后 先点击configue再点击generate  

 4、开始编译

 在 build 文件下执行 make  (可根据自身虚拟机配置情况指定编译线程数 如  make -j4)

make -j4

编译过程中一定会报错,不过不用担心。

错误一、

../../lib/libopencv_imgcodecs.so.3.4.13: undefined reference to `png_do_expand_palette_rgb8_neon'
../../lib/libopencv_imgcodecs.so.3.4.13: undefined reference to `png_init_filter_functions_neon'
../../lib/libopencv_imgcodecs.so.3.4.13: undefined reference to `png_do_expand_palette_rgba8_neon'
../../lib/libopencv_imgcodecs.so.3.4.13: undefined reference to `png_riffle_palette_neon'
collect2: error: ld returned 1 exit status

解决方法:

进入 自己的 opencv-3.4.13/3rdparty/libpng/pngpriv.h 中将 

if (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \

改为 

if defined(PNG_ARM_NEON) && (defined(__ARM_NEON__) || defined(__ARM_NEON)) && \

再次 执行 make 命令

错误二、

因为网络原因,cmake的时候,一些文件没下全,编译时报错如下,

vgg_generated_120.i: No such file or directory

rk3588使用opengles显示1080p视频 rk3288 opencv_2d_12

 其实,我这里少了11个文件,不在一一贴图了,报错内容差不多,少的文件分别为 vgg_generated_48.i,vgg_generated_64.i、vgg_generated_80.i、vgg_generated_120.i、boostdesc_lbgm.i、boostdesc_bgm_bi.i、boostdesc_bgm_hd.i、boostdesc_bgm.i、boostdesc_binboost_064.i、boostdesc_binboost_128.iboostdesc_binboost_256.i

这边放百度网盘了,需要的自提,另外,文件查找不易,请点赞支持支持!!!

http://链接:https://pan.baidu.com/s/1WBt9rZCIs5NbOo_MbfjivA 提取码:0012 --来自百度网盘超级会员V4的分享

然后把 下载下来的文件放在自己的 opencv_contrib-3.4.12/modules/xfeatures2d/src 下即可。然后继续 执行 make命令

错误三、

因为路径问题报错

fatal error: opencv2/xfeatures2d/nonfree.hpp: No such file or directory

rk3588使用opengles显示1080p视频 rk3288 opencv_百度网盘_13

这里会报好几个类似的问题,解决方法是一样的,不在一一贴图了。

如,这问题,进入自己的  opencv_contri-3.4.12/modules/xfeatures/include/opencv2/xfeatures2d.hpp,将 43行的

#include "opencv2/xfeatures2d/nonfree.hpp"

改为绝对路径,如

#include "/home/aunov/opencv_contri3.4.12/modules/xfeatures/include/opencv2/xfeatures2d/nonfree.hpp"

修改完继续 执行 make命令

我的到这样已经没有再报错了

(11)编译的最后一步

make install

完成后,会在自己的install下生成如下文件夹

rk3588使用opengles显示1080p视频 rk3288 opencv_百度网盘_14

自此,编译已经完成!!!

5、打包放在 RK3588 上

 (1)打包 自己的 install 目录 

tar -cvf aarch64_install.tar arrch64_insatll

(2)将 打包的文件 拷贝到 RK3588 中的 任意一个文件夹下并解压,我的放在了 /usr/bin下

解压命令

tar -vxf aarch64_install.tar

(3) 添加路径

打开 /etc/ld.so.conf文件

vi /etc/ld.so.conf

添加库的绝对路径,如下

rk3588使用opengles显示1080p视频 rk3288 opencv_linux_15

 保存并退出

生效路径

ldconfig

自此,opencv 移植完成

用Qt写了一个小程序,运行效果如下

rk3588使用opengles显示1080p视频 rk3288 opencv_百度网盘_16