(详细使用指南)Linux下交叉编译带ffmpeg的opencv并移植到RK3588等ARM端

news2025/1/18 0:24:30

一 问题背景

      

  瑞芯微RK3588等嵌入式板作为边缘端设备为算法模型的部署提供了便利,目前很多分类或好检测模型针对边缘端做了优化或量化,使得在边缘端也能达到实时稳定的识别和检测效果。
        但嵌入式设备普遍的flash emmc不大,一般在32G左右,如果在嵌入式设备进行大量的编译操作很容易空间不足。通过交叉编译的方式避免文件包在嵌入式上编译,可以通过在x86 PC端等进行交叉编译,然后将编译好的文件夹拷贝到ARM设备平台上。

交叉编译是指在一台计算机上生成目标平台的可执行程序。通常情况下,我们在开发软件时会在同一平台上编译、运行程序,但有时候需要将程序部署到不同体系结构或操作系统的设备上运行,这就需要使用交叉编译工具链来生成适用于目标平台的可执行文件。常见的应用场景包括在开发嵌入式系统、移动应用程序或跨平台软件时进行交叉编译。


二 问题描述

        需要将一个类似于CNStream的框架移植到RK3588板子上,跑通示例模型,其中需要用到交叉编译后的带ffmeg的opencv,读取示例MP4视频,作为模型算法输入数据,完成框架移植与测试。


三 环境准备

-linux系统:unbuntu18.04 X86_64
-rk3588软件包:rknn-toolkit2:1.5.2-cp36
-交叉编译工具:gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu
-硬件平台:寒武纪MLU270

1 创建docker虚拟环境

docker创建命令如下:

	docker run -it --privileged --name NewF3588 -p 35886:22 -v /home/lc/hang/rk3588:/workspace/hang/rk3588  rknn-toolkit2:1.5.2-cp36  /bin/bash

2 搭建交叉编译环境

step1:交叉编译工具链下载

下载交叉编译工具链,将交叉编译工具放置在docker虚拟环境中,比如/opt目录下改名gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu为aarch64-rockchip-linux-gnu  

step2: 设置交叉编译环境变量

关于linux下环境变量的设置,可看此处博文https://blog.csdn.net/xishining/article/details/119283522

通过vim ~/.bashrc命令打开环境变量配置文件,主要是添加lib、lib64余bin文件

在文件最后添加:  

 export LD_LIBRARY_PATH=/opt/aarch64-rockchip-linux-gnu/lib:/opt/aarch64-rockchip-linux-gnu/lib64:$LD_LIBRARY_PATH
export PATH=$PATH:/opt/aarch64-rockchip-linux-gnu/bin

添加后保存并 source ~/.bashrc

验证交叉编译环境是否搭建成功,在任意目录执行命令:

aarch64-none-linux-gnu-gcc -v

 若返回gcc版本号,则表示成功。


 四 源码下载与安装

1 两个必要的软件包
apt-get install build-essential pkg-config
2 cmake3.23.0

https://cmake.org/download/icon-default.png?t=N7T8http:// https://cmake.org/download/



3 opencv-4.5.1

https://opencv.org/releases/page/2/icon-default.png?t=N7T8http:// https://opencv.org/releases/page/2/



4 opencv_contrib-4.5.1

https://github.com/opencv/opencv_contrib/releases/tag/4.5.1icon-default.png?t=N7T8http:// https://github.com/opencv/opencv_contrib/releases/tag/4.5.1



5 ffmpeg-4.2.9

https://ffmpeg.org/download.html#releasesicon-default.png?t=N7T8http:// https://ffmpeg.org/download.html#releases


以上软件下载源码后,解压至/opt目录下,并先创键/arm/fffmpeginstall夹用于后续存放ffmeg相关配置文件


五 源码编译

1 cmake源码编译

cmake --version检查是否安装成功

2 ffmepg交叉编译
#在/opt目录下依次执行以下命令:
 cd ffmpeg-4.2.9
#不带x264的ffmpeg编译
#注意修改--cross-prefix,--cc,--cxx,--prefix为自己相关文件路径,其他不变
./configure --enable-cross-compile --target-os=linux --arch=aarch64 \
--cross-prefix=/opt/aarch64-rockchip-linux-gnu/bin/aarch64-none-linux-gnu- \
--cc=/opt/aarch64-rockchip-linux-gnu/bin/aarch64-none-linux-gnu-gcc \
--cxx=/opt/aarch64-rockchip-linux-gnu/bin/aarch64-none-linux-gnu-g++ \
--prefix=/opt/arm/fffmpeginstall \
--disable-asm --enable-parsers --disable-decoders --enable-decoder=h264 --disable-debug --enable-ffmpeg --enable-shared --disable-static --disable-stripping --disable-doc
#带x264的ffmpeg编译
./configure --enable-cross-compile --target-os=linux --arch=aarch64 \
--cross-prefix=/opt/aarch64-rockchip-linux-gnu/bin/aarch64-none-linux-gnu- \
--cc=/opt/aarch64-rockchip-linux-gnu/bin/aarch64-none-linux-gnu-gcc \
--cxx=/opt/aarch64-rockchip-linux-gnu/bin/aarch64-none-linux-gnu-g++ \
--prefix=/opt/arm/fffmpeginstall \
--extra-cflags=-I/opt/arm/fffmpeginstall/include \
--extra-ldflags=-L/opt/arm/fffmpeginstall/lib \
--disable-asm --enable-parsers --disable-decoders --enable-decoder=h264 --disable-debug --enable-ffmpeg --enable-shared --disable-static --disable-stripping --disable-doc --enable-libx264 --enable-gpl

执行make命令编译,并查看是否编译成功,有无报错。

make -j$(nproc)

make install

然后进入你的--prefix目录,查看生成的文件(bin,include,lib,share)
在/opt/arm/fffmpeginstall//bin目录下执行,file libavcodec.so.60.35.100命令,若出现aarch64则表示ffmpeg交叉编译成功

设置ffmpeg的环境变量(这里是设置的临时的环境变量):
    export PKG_CONFIG_PATH=/opt/arm/fffmpeginstall/lib/pkgconfig$PKG_CONFIG_PATH
    export PKG_CONFIG_LIBDIR=/opt/arm/fffmpeginstall/lib$PKG_CONFIG_LIBDIR
    export LD_LIBRARY_PATH=/opt/arm/fffmpeginstall/lib:$LD_LIBRARY_PATH
    export 查看环境变量格式是否正确

进入/opt/aarch64-rockchip-linux-gnu/aarch64-none-linux-gnu/libc/usr路径下,将ffmpeg生成的文件(bin,include,lib,share目录下的文件)分别对应复制到
usr目录下bin,include,lib,share文件夹中

3 opencv&opencv_contrib交叉编译

STEP1:先把opencv_contrib源码复制到opencv源码目录下

STEP2:进入opencv源码目录,进行以下操作:

        mkdir build 用于存放cmake的生成文件
        mkdir install用于存放opencv交叉编译的生成文件夹,
        vim tool_chain.cmake 创键交叉编译工具链文件
 

#修改tool_chain.cmake文件,添加以下内容(注意修改相关路径):
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR aarch64 )
set( CMAKE_C_COMPILER /opt/aarch64-rockchip-linux-gnu/bin/aarch64-none-linux-gnu-gcc)
set( CMAKE_CXX_COMPILER /opt/aarch64-rockchip-linux-gnu/bin/aarch64-none-linux-gnu-g++)
#set( OPENCV_ENABLE_PKG_CONFIG ON)
#set( CMAKE_C_FLAGS "-Wl,-rpath-link=/opt/arm/fffmpeginstall/lib")
set( CMAKE_FIND_ROOT_PATH "/opt/arm/fffmpeginstall/lib" )
set( CMAKE_CXX_FLAGS "-Wl,-rpath=/opt/arm/fffmpeginstall/lib")
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )

保存后关闭 tool_chain.cmake文件。

STEP3:进入opencv源码根目录,进入build文件夹,执行以下命令:

cmake -DCMAKE_INSTALL_PREFIX=../install \
-DOPENCV_EXTRA_MODULES_PATH=../opencv_contrib-4.5.1/modules \
-DWITH_FFMPEG=ON \
-DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake ..

出现ffmpeg YES 表示链接ffmpeg成功,然后执行make命令编译生成

make -j$(nproc)

make install

六 应用说明

一般应用:

最后在opencv源码根目录install文件夹下将include和lib里的文件分别拷贝到ARM板的/usr/include 和/usr/lib下 然后打开终端执行可执行文件即可。

本例应用:

最后在opencv源码根目录install文件夹下将include和lib里的文件分别替换框架程序原opencv源码,交叉编译并将生成的文件放到目标嵌入式板子上。

因为采用的是opnecv硬编码ffmpeg,所以需要将前文中ffmpeg编译生成的bin,include,lib,share文件夹放到目标RK3588板上。并设置临时环境变量。


#环境变量设置:
#环境变量查询命令:
echo $PATH
echo $LD_LIBRARY_PATH
echo $PKG_CONFIG_PATH
echo $PKG_CONFIG_LIBDIR

#RK3588板子:
#ffmpeg库:
#在板子环境下的/opt目录下新建/arm/fffmpeginstall目录,用于放置ffmpeg的四个文件夹
export PATH=$PATH:/opt/arm/fffmpeginstall/bin
export LD_LIBRARY_PATH=/opt/arm/fffmpeginstall/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/opt/arm/fffmpeginstall/lib/pkgconfig:$PKG_CONFIG_PATH
export PKG_CONFIG_LIBDIR=/opt/arm/fffmpeginstall/lib:$PKG_CONFIG_LIBDIR

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1470294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Flink精讲】Flink任务调度机制

Graph 的概念 Flink 中的执行图可以分成四层: StreamGraph -> JobGraph -> ExecutionGraph -> 物理执 行图。 StreamGraph:是根据用户通过 Stream API 编写的代码生成的最初的图。用来表示程序的拓扑结构。JobGraph: StreamGraph …

科学高效备考2024年AMC10:2000-2023年1250道AMC10真题练一练

我整理了2000-2023年的全部AMC10的AB卷真题共1250题,并且独家制作了多种在线练习,利用碎片化时间,一年足以通过自学在2024年AMC10竞赛中取得好成绩。 我们今天继续来随机看五道题目和解析。 2000-2023年AMC10真题练一练:2013年第…

项目打包提示一堆 ts 类型错误问题解决

问题 vue3 ts 项目在打包的过程中报了一大堆 ts 类型错误提示,如下图所示: 报错:Could not find a declaration file for module … implicitly has an ‘any’ type. 解决方法 查看 package.json 文件,可以看到,默…

UE蓝图 序列(Sequence)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 UE蓝图 返回结果(FunctionResult)节点和源码 UE蓝图 函数调用(CallFunction)节点和源码 UE蓝图 函数调用(CallFunction)…

three.js第一个3D案例

在正式学习Three.js之前,先做一些必要的准备工作,具体说就是下载threejs官方文件包,threejs官方文件包提供了很多有用的学习资源。 threejs官方文件包所有版本:https://github.com/mrdoob/three.js/releases threejs文件资源目录…

Go 利用上下文进行并发计算

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力! 在Go编程中,上下文(context)是一个非常重要的概念,它包含了与请求相关的信息&…

【嵌入式移植】7、U-Boot源码分析4—链接脚本分析

U-Boot源码分析4—链接脚本分析 1 u-boot-spl.lds1.1 链接脚本的生成1.2 u-boot-spl.lds内容分析1.3 text - 程序代码段1.4 sram其它段定义1.4.1 .rodata只读数据段1.4.2 .data数据段1.4.3 .u_boot_list段 1.5 BSS段1.6 /DISCARD/ 从上一篇文章【嵌入式移植】6、U-Boot源码分析…

130 如何通过vs2017开发linux c++程序

使用VS2017开发linux下的应用程序(C/C)_vc_linux.exe vs2017-CSDN博客 参考上面这哥们的,写的很详细 前言 本文章记录如何使用VS2017进行linux应用程序的开发(针对新手小白),VS2017能较为方便的通过SSH编辑…

电脑蓝牙在哪里打开?1分钟轻松打开蓝牙!

“我在操作电脑的时候想将电脑的蓝牙打开来连接音响和键盘,但是不知道电脑蓝牙应该如何打开,有什么比较简单的方法吗?” 随着无线技术的日益发展,蓝牙已成为连接各种设备的重要桥梁。无论是传输文件、音频还是与外部设备进行通信&…

YOLO学习中的琐碎知识点

目录 一、导入的库 二、名词介绍 (1)pytorch张量 (2)边界框(bounding box) 三、pycharm操作 (1)参数设置 四、文件认识 五、YOLO如何训练自己的模型 一、导入的库 import to…

笔记本Win 10系统查看电池健康状况

博主最近换了个笔记本电池,之前的电池容量明显变小了很多,而且出现了轻微鼓包的情况。所以用gpt问了一下怎么用系统的方法查看电池情况。 在Windows 10系统中,您可以通过以下步骤来查看笔记本电脑电池的健康状况: 打开命令提示符&…

神经网络系列---归一化

文章目录 归一化批量归一化预测阶段 测试阶段γ和β(注意)举例 层归一化前向传播反向传播 归一化 批量归一化 (Batch Normalization)在训练过程中的数学公式可以概括如下: 给定一个小批量数据 B { x 1 , x 2 , … …

线程普通任务执行流程

(1)先判断是否存在空闲线程,存在直接分配,不存在执行(2); (2)判断工作线程数量小于核心数量,未超出创建核心线程执行线程任务,超出执行&#xff…

为什么会员模式是一种明智的扩张方式

会员模式看起来是一种有趣、令人兴奋且很酷的业务发展方式,但当您真正深入研究时,您可能会惊讶地发现它远不止于此。 会员资格为我们提供了一条道德扩展的途径。我们可以就地为客户提供服务。 这就是为什么会员模式可能成为您企业的下一步,…

LeetCode 热题 100 | 二叉树(一)

目录 1 基础知识 1.1 先序遍历 1.2 中序遍历 1.3 后序遍历 2 94. 二叉树的中序遍历 3 104. 二叉树的最大深度 4 226. 翻转二叉树 5 101. 对称二叉树 菜鸟做题,语言是 C 1 基础知识 二叉树常见的遍历方式有: 先序遍历中序遍历后序遍历…

LeetCode | 寻找两个正序数组的中位数 Python C语言

Problem: 4. 寻找两个正序数组的中位数 文章目录 思路解题方法Code结果结果一些思考 思路 先合并,后排序,最后找中间轴。 解题方法 由解题思路可知 Code 这是python3的代码。 class Solution:def findMedianSortedArrays(self, nums1: List[int], …

微服务知识02

1、九大高并发解决方案 2、系统架构图​​​​​​​ 3、分布式事务 本地事务、分布式事务 操作不同服务器的数据库(垂直分库) 4、分布式事务解决方案(没有seata之前) (1)XA协议(强一致性&a…

STM32单片机基本原理与应用(八)

温度传感器实验 实验内容: 单片机通过代码模拟1-Wire总线并对DS18B20进行读写,并在TFTLCD屏幕上显示当前实时温度。 电路原理图: 1-Wire总线 1-Wire总线:即单总线协议,采用单根信号线,既传输时钟&#…

深度学习基础(一)神经网络基本原理

之前的章节我们初步介绍了机器学习相关基础知识,目录如下: 机器学习基础(一)理解机器学习的本质-CSDN博客 机器学习基础(二)监督与非监督学习-CSDN博客 机器学习基础(四)非监督学…

python jupyter notebook打开页面方便使用

如果没安装jupyter, 请安装: pip install jupyter notebook 运行jupyter notebook jupyter-notebook