RK3588J交叉编译aarch64-opencv记录全过程-GTK(踩坑大王)

先说成功流程,再说失败流程和所遇到的坑。

使用环境准备

虚拟机VW -Ubuntu20.04

创龙RK3588J芯片

opencv3.4.5

交叉编译工具链-gcc-aarch64-linux-gnu

0.装opencv缘故:

yolov5-rtsp移植时,RKNPU2的example中的opencv库不全,缺少highgui.a静态库,不支持imshow等函数,所以需要自己重新交叉编译opencv并将编译好的aarch64动态库导入(注意我是aarch64版本的)--此文章仅供记录分享,不足之处请留言,谢谢!

生成可执行文件时报的错误。

查询OpenCV版本:

通过在CMakeList.txt添加message发现opencv所支持的库。

可以发现没有链接higugui的静态库。查看对应库---没有highgui.a。重装OpenCV3.4.5,装得动态库。highgui模块是为高层GUI图形用户界面模块,包含媒体的输入输出、视频捕捉、图像和视频的编解码、图形交互界面的接口等内容。

1.安装OpenCV3.4.5

1.安装依赖项:

sudo apt-get install build-essential libgtk2.0-dev libjpeg-dev  libtiff5-dev libopenexr-dev libtbb-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libgtk-3-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev pkg-config

# 添加源以继续安装依赖libjasper
sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo add-apt-repository "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe"

sudo apt-get install libjasper-dev

其中GStreamer是用来构建流媒体应用的开源多媒体框架,简化音视频应用程序开发,可以用来处理像 MP3OggMPEG1MPEG2AVIQuicktime 等多种格式的多媒体数据。与它有关的库:libgstbase-1.0.so.0, libgstreamer-1.0.so.0, libgstapp-1.0.so.0, libgstriff-1.0.so.0, libgstpbutils-1.0.so.0, libgstaudio-1.0.so.0, libgstvideo-1.0.so.0。

GTK是一个开源的跨平台GUI工具包。使用imshow等函数会用到

2.安装交叉编译工具链,配置aarch安装包环境

aarch64-linux-gnu-gcc 是一个交叉编译工具链,可以在其他架构的系统中,编译安装 64 arm 架构的程序。常用在嵌入式代码的移植中。aarch64-linux-gnu-gcc 是由 Linaro 公司基于 GCC 推出的的 ARM 交叉编译工具。可用于交叉编译 ARMv8 64 位目标中的裸机程序u-bootLinux kernelfilesystem App 应用程序。aarch64-linux-gnu-gcc 交叉编译器必须安装在 64 位主机上,才能编译目标代码。

sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
sudo dpkg –add-architecture
sudo touch /etc/apt/source.list.d/arm-cross-compile-sources.list
sudo vi /etc/apt/source.list.d/arm-cross-compile-sources.list
#在打开的文件添加以下内容
deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal main restricted
deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal-updates main restricted
deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal universe
deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal-updates universe
deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal multiverse
deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal-updates multiverse
deb [arch=armhf,arm64] http://ports.ubuntu.com/ focal-backports main restricted universe multiverse
#更新包
sudo apt-get update

 3.安装arrch64对应平台包-后面再缺啥补啥

sudo apt-get install libgstreamer1.0-dev:arm64 libgstreamer-plugins-base1.0-dev:arm64 libglib2.0-dev:arm64
sudo apt install libglib2.0-dev:arm64
sudo apt install libgtk2.0-dev:arm64
sudo apt install libgtk-3-dev:arm64

4.获取源码opencv3.4.5

方式1:源码下载 https://opencv.org/releases/ 找对应source3.4.5版本的下载。

然后unzip opencv-3.4.5.zip

方式2:使用命令下载:

git clone https://github.com/opencv/opencv.git

cd opencv //切换到3.4.5版本

git checkout 3.4.5

5.编译opencv-使用cmake命令

OpenCV2.2以后版本需要使用cmake工具生成编译OpenCV的makefile文件。这是因为 CMake 提供了跨平台支持,能够自动处理不同平台的依赖关系和配置。

当程序是一个源文件时,直接使用gcc命令就可以编译。对于多个源文件的项目,使用 make 工具更为高效。make 本身并不执行编译和链接,而是通过批处理方式执行 Makefile 中指定的命令来完成这些任务。Makefile 中包含了调用 gcc 等编译器的命令。在小型项目中,可以直接编写 Makefile 进行编译和链接;而在大型项目中,手动维护 Makefile 可能会变得复杂且不方便。此时,使用 CMake 工具更加灵活,它通过解析 CMakeLists.txt 文件生成跨平台的 Makefile。

运行 CMake 后,会输出一些编译信息和中间文件(包括 Makefile)。这些中间文件在发布代码时通常可以删除,因为它们不需要随代码一起分发。通过创建一个专门的构建目录(例如 build)来存放这些中间文件,可以使项目结构更为清晰。

PS:CMake 工具利用 CMakeLists.txt 文件生成跨平台的 Makefile,而 make 则利用这些 Makefile 批处理编译和链接源文件。

方式1:使用cmake配置指令

首先在opencv源码目录下创建一个中间构建目录build

sudo mkdir build

cd build 进入build目录

配置cmake在指令中添加交叉编译链路径:

sudo cmake  -D CMAKE_BUILD_TYPE=RELEASE  -D CMAKE_C_COMPILER=/usr/bin/aarch64-linux-gnu-gcc -D CMAKE_CXX_COMPILER=/usr/bin/aarch64-linux-gnu-g++ -D BUILD_SHARED_LIBS=ON -D CMAKE_CXX_FLAGS=-fPIC -D CMAKE_C_FLAGS=-fPIC -D CMAKE_EXE_LINKER_FLAGS=-lpthread -ldl -D ENABLE_PIC=ON -D WITH_1394=OFF -D WITH_ARAVIS=OFF -D WITH_ARITH_DEC=ON -D WITH_ARITH_ENC=ON -D WITH_CLP=OFF -D WITH_CUBLAS=OFF -D WITH_CUDA=OFF -D WITH_CUFFT=OFF -D WITH_FFMPEG=ON -D WITH_GSTREAMER=ON -D WITH_GSTREAMER_0_10=OFF -D WITH_HALIDE=OFF -D WITH_HPX=OFF -D WITH_IMGCODEC_HDR=ON -D WITH_IMGCODEC_PXM=ON -D WITH_IMGCODEC_SUNRASTER=ON -D WITH_INF_ENGINE=OFF -D WITH_IPP=OFF -D WITH_ITT=OFF -D WITH_JASPER=ON -D WITH_JPEG=ON -D WITH_LAPACK=ON -D WITH_LIBREALSENSE=OFF -D WITH_NVCUVID=OFF -D WITH_OPENCL=OFF -D WITH_OPENCLAMDBLAS=OFF -D WITH_OPENCLAMDFFT=OFF -D WITH_OPENCL_SVM=OFF -D WITH_OPENEXR=OFF -D WITH_OPENGL=OFF -D WITH_OPENMP=OFF -D WITH_OPENNNI=OFF -D WITH_OPENNNI2=OFF -D WITH_OPENVX=OFF -D WITH_PNG=ON -D WITH_PROTOBUF=OFF -D WITH_PTHREADS_PF=ON -D WITH_PVAPI=OFF -D WITH_QT=OFF -D WITH_QUIRC=OFF  -D WITH_TBB=OFF -D WITH_TIFF=ON -D WITH_VULKAN=OFF -D WITH_WEBP=ON -D WITH_XIMEA=OFF -D CMAKE_INSTALL_PREFIX=./install  -D WITH_GTK=ON  WITH_GTK_2_X=ON ..
解释:

-D CMAKE_BUILD_TYPE=RELEASE:指定编译类型为RELEASE,将启用优化和禁用调试信息

-D CMAKE_INSTALL_PREFIX=./install:指定安装目录(重要!避免与X86版本混淆),如果不加该命令。则默认各部分分别安装在/usr/local目录的include/,bin/,lib/文件夹下。

-D WITH_GSTREAMER=ON:启用GStreamer支持,使opencv可以读取和写入GStreamer流

 -D WITH_GTK=ON  WITH_GTK_2_X=ON:指定开启GTK支持

-D WITH_OPENGL=OFF:指定关闭OpenGL支持

-D BUILD_SHARED_LIBS=ON:表示生成动态库,OFF为静态库

CMAKE_EXE_LINKER_FLAGS:STRING=-lpthread -lrt。保存并退出。-lpthread支持线程;-ldl避免未定义dlopen;-lrt避免未定义

.. :表示回到上一级目录

执行完cmake后会生成make的清单,但还没有开始编译,查看清单交叉编译工具链的路径识别是否正确,各功能支持是否符合期望。

除了直接在配置cmake指令中添加交叉编译链路径,还可以修改在opencv中的platform/linux/aarch64-gnu.toolchain.cmake修改添加工具链路径:

set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version")
set(CMAKE_C_COMPILER /usr/bin/aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER /usr/bin/aarch64-linux-gnu-g++)
set(GNU_MACHINE "aarch64-linux-gnu" CACHE STRING "GNU compiler triple")
include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake")

然后修改cmake工具链路径-D CMAKE_C_COMPILER=/usr/bin/aarch64-linux-gnu-gcc -D CMAKE_CXX_COMPILER=/usr/bin/aarch64-linux-gnu-g++为DCMAKE_TOOLCHAIN_FILE=../platforms/linux/aarch64-gnu.toolchain.cmake

然后查看配置:

GTK为yes,表示已经打开GTK支持。如果目标开发板不支持GTK可以使用QT

开始编译:

在build目录下新建install目录(安装目录,cmake安装路径自己设置的)

sudo mkdir install

sudo make -j4 //开始编译,4根据CPU核心数调整,我的虚拟机是4核的

编译成功,在install目录下生成四个文件

6.安装opencv

sudo make install安装成功:

7.编译Yolov5demo

修改example/rknn_yolov5_demo下的CMakeList.txt文件的opencv路径,example中的样例使用的是一个简易的OpenCV库,需要切换到自己编译生成的OpenCV库,OpenCV_DIR变量改为已安装的路径build/install/share/OpenCV(根据上下文写绝对路径)

编译yolov5_video_demo,生成可执行程序成功

sudo ./build-linux_RK3588.sh

将opencv-install-lib目录下的库文件cp到如下目录。(重要),不上传会在板端报找不到xxx.so库文件的错误。

8.推送板端

进入板端rknn_yolov5_demo_Linux目录,先运行指令:

export LD_LIBRARY_PATH=./lib,然后执行rtsp流输入命令安装成功:

2、使用cmake-gui编译opencv-失败例程

cmake --version //查看是否安装cmake

sudo apt-get install cmake-gui

cmake-gui --version

cd opencv

sudo mkdir build

sudo cmake-gui .. //进入工具链配置界面,后面空格加两点启动图形界面

卸载cmake指令:sudo apt-get autoremove cmake

图忘记截下来了,找的网图(下同,侵权联系我删除)。

where is the source code:里写上opencv的源文件路径

where to build the binaries:里面写上作为cmake编译arm64的工作目录(创建的build文件)

然后点击configure

这里generator保持为Unix Makefiles,然后选择第四个选项:Specify options for cross-compiling
最后点击Next。

Targeting System选的是Linux,version可以不用管。target root为交叉编译工具所在包含文件夹/usr/aarch-linux-gnu/lib,C\C++为对应工具链的路径:/usr/bin/aarch64-linux-gun-gcc/g++。

点击finish。

查看中间红色配置部分:

选择配置注意:勾选BUILD_JPEG、BUILD_PNG。Search位置输入install找到CMAKE_INSTALL_PREFIX 将后面的值改为安装目录,不改安装到usr/local目录下,容易与x86版本的搞混。Search位置输入Z,把zip库(BUILD_ZLIB选项)选中(Ubuntu 20.04 不选择可能会报错)。勾选GTK GTK_2X配置,然后点击configure,点击generate。关闭对话框。使用cmake生成makefile文件。

这个时候在下面就会看到配置,精彩的时候到了,发现我已经勾选了GTK配置,结果显示NO,导致后面推送板端报错找不到对应文件。果断放弃图形配置,使用cmake指令行。(目前没找到原因)。如果不需要GTK的就可以直接开始编译了。

cd build

sudo make -j4

sudo make install

3.报错汇总:

1.编译Yolov5过程中报错,安装架构错误:

重装aarch64架构

2.编译opencv报重入错误报告程序:

内存不足,清理内存

3.板端推理报错;

将opencv生成的所有动态库cp到执行文件的lib目录下

4.板端推理报错;

使用imshow等函数,但GTK配置禁用导致,重新编译opencv启用GTK配置。

5.编译opencv报错

直接使用opencv目录的zlib,即/opencv/3rdparty/zlib/zlib.h。找到报错对应的文件,修改头文件为相对路径,例如:

#include "zlib.h" 改为#include "../zlib/zlib.h"

#include "../../../3rdparty/opencv/3rdparty/zlib/zlib.h"

解释:../../../3rdparty/opencv/3rdparty/zlib 是从 src 目录到 zlib 目录的相对路径。../表示回到上一级目录

6.编译opencv报错:

可能原因1:安装对应依赖

可能原因2:更换工具链(我使用之前安装的交叉编译工具链会一直报找不到文件的错误,后安装aarch64-linux-gnu解决问题)

检查是否安装对应依赖项;

pkg-config --cflags --libs gtk+-2.0

或dpkg -L libgtk2.0-dev

7.编译opencv报错(使用原本工具链的错误)

../../lib/libopencv_imgcodecs.so.3.4.5: undefined reference to `png_init_filter_functions_neon'

找到图示下的头文件,修改对应内容解决:

/*# if (defined(ARM_NEON) || defined(__ARM_NEON)) && \ */该行注释掉换为下面的一行
#if defined(PNG_ARM_NEON) && (defined(ARM_NEON) || defined(__ARM_NEON)) && \

4.杂记

查看已安装OpenCV版本指令:

pkg-config --modversion opencv

未编译成功清理文件指令:

进入中间构建文件build目录执行:

sudo rm -rf *

然后重新配置cmake编译。

如果安装在系统文件夹:

进入build目录

执行sudo make uninstall 此命令会删除安装时添加的所有文件,但是不处理文件夹。可将opencv相关的可执行文件、lib文件等从/usr/local/bin//usr/local/libusr/local/share中删除,不过还是会留空下文件夹,需要手动删除。

rm -r build 删除目的文件夹

rm -r /usr/local/include/opencv2 /usr/local/include/opencv /usr/include/opencv /usr/include/opencv2 /usr/local/share/opencv /usr/local/share/OpenCV /usr/share/opencv /usr/share/OpenCV /usr/local/bin/opencv* /usr/local/lib/libopencv*

参考资料:

  1. opencv-3.4.1-arm编译安装 QT-- 超详细:

opencv-3.4.1-arm编译安装 -- 超详细_opencv arm编译-CSDN博客

  1. OpenCV 之交叉编译及ARM移植

https://www.ebaina.com/articles/140000017232

  1. opencv-4.1-arm编译安装 -- 超详细

opencv-3.4.1-arm编译安装 -- 超详细_opencv arm编译-CSDN博客

  1. 移植opencv到嵌入式arm详细过程

移植opencv到嵌入式arm详细过程_arm 使用opencv-CSDN博客

       1.ubuntu 20.04 aarch64 平台交叉编译 glib

ubuntu 20.04 aarch64 平台交叉编译 glib_aarch64 glib 版本-CSDN博客

        1.RK3588移植-opencv交叉编译aarch64

RK3588移植-opencv交叉编译aarch64_rk3588 rknpu2 imshow 没有-CSDN博客

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值