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

一 问题背景

      

  瑞芯微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.mzph.cn/news/702649.shtml

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

相关文章

Jitsi Meet 大型视频会议调优方案

jitsi meet 大型视频会议调优方案 在举办一些大型会议的时候,比如100个人会议,为了节约宽带和节省资源,我们并不会选择传输全部的音视频资源。 举个例子,比如100个人线下会议,如果大家都说话的情况下,大家要么听不清,要么听得是声音最大的那几个人。 视频会议也可以借…

Mysql运维篇(五) 部署MHA--主机环境配置

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。如有侵权,请留言,我及时删除! 大佬博文 https://www.cnblogs.com/gomysql/p/3675429.html MySQL 高可用(MHA&#x…

SpringMVC 学习(五)之域对象

目录 1 域对象介绍 2 向 request 域对象共享数据 2.1 通过 ServletAPI (HttpServletRequest) 向 request 域对象共享数据 2.2 通过 ModelAndView 向 request 域对象共享数据 2.3 通过 Model 向 request 域对象共享数据 2.4 通过 map 向 request 域对象共享数据 2.5 通过…

【前端素材】推荐优质后台管理系统Jampack平台模板(附源码)

一、需求分析 后台管理系统(或称作管理后台、管理系统、后台管理平台)是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成,为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

macOS系统下载IDEA的操作流程

第一步 进入官网 Download IntelliJ IDEA – The Leading Java and Kotlin IDE 第二步 根据mac的芯片选择版本下载 芯片的查看位置是【设置】-【通用】-【关于本机】-第二个,我的是Apple芯片,选Apple Silicon -- 第三步 右上角下载处打开安装包&…

Seata 入门知识

目录 概述 工作流程 工作模式 AT模式 TCC模式 概述 Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 AT模式是阿里首推…

CUDA C++ 编程指南

目录 1. Introduction1.1. The Benefits of Using GPUs1.2. CUDA: A General-Purpose Parallel Computing1.3. A Scalable Programming Model CUDA C Programming Guide 1. Introduction 1.1. The Benefits of Using GPUs 在相似的价格和功耗范围内,图形处理单…

9个最受欢迎的开源自动化测试框架盘点!

自动化测试框架可以帮助测试人员评估多个Web和移动应用程序的功能,安全性,可用性和可访问性。尽管团队可以自己构建复杂的自动化测试框架,但是当他们可以使用现有的开源工具,库和测试框架获得相同甚至更好的结果时,通常…

Github开源贡献者的狂欢——教你如何免费领取价值$200的Starknet空投

前言: 2024 又迎来了四年一度的 BTC 减半时刻,币圈仿佛一下又热闹了起来,这几天有一个新的基于 ETH 的项目诞生了:StarkNet,代号 STRK,凡是在前 5000 个开源项目贡献过至少 3 个 commit 的程序猿都会被空投…

Linux系统网络服务部分拓展练习

1)网关服务器:ens36:12.0.0.254/24,ens33:192.168.241.254/24;Server1:192.168.241.0/24;PC1和server2:自动获取IP;交换机无需配置。要求能够使用Xshell等远程…

MySQL - 事务日志

目录 1. redo日志 1.1 为什么需要REDO日志 1.2 REDO日志的好处、特点 1. 好处 2. 特点 1.3 redo的组成 1.4 redo的整体流程 1.5 redo log的刷盘策略 1.6 不同刷盘策略演示 1. 流程图 ​编辑2. 举例 1.7 写入redo log buffer 过程 1.8 redo log file 1. 相关参数…

matlab倒立摆小车LQR控制动画

1、内容简介 略 54-可以交流、咨询、答疑 2、内容说明 略 摆杆长度为 L,质量为 m 的单级倒立摆(摆杆的质心在杆的中心处),小车的质量为 M。在水平方向施加控制力 u,相对参考系产生位移为 y。为了简化问题并且保其实质不变,忽…

【SelectIO】bitslice原语学习记录

基本概念 在Ultrascale (plus)系列上的FPGA中,Xilinx引入了bitslice硬核,它取代了7系列上的IDELAYCTRL/IODELAY/IOSERDES/IODDR系列硬核,用于为HP(High Performance)类型Bank上的IO接口提供串并转化、信号延时、三态控…

【k8s资源调度-HPA(自动扩缩容)】

1、HPA可以做什么? 通过观察pod的cpu、内存使用率或自定义metrics指标进行自动的扩容或缩容pod的数量。通常用于Deployment,不适用于无法扩/缩容的对象,如DaemonSet。控制管理器每隔30s(可以通过-horizontal-pod-autoscaler–sync-period修改…

特征选择|一种提升预测模型性能的方法(原理及其优化实现,Matlab)

文章来源于我的个人公众号:KAU的云实验台,主要更新智能优化算法的原理、应用、改进 如今,生成的数据集呈指数级增长,这将产生具有大量特征和样本的数据集,而显然,某些特征是不相关/冗余的,它们…

springBoot整合Redis(一、Jedis操作Redis)

在springboot环境下连接redis的方法有很多,首先最简单的就是直接通过jedis类来连接,jedis类就相当于是redis的客户端表示。 但是因为现在比较常用的是:StringRedisTemplate和RedisTemplate,所以jedis只做简单的介绍。 一、Jedis…

Langchain-Chatchat部署总结

项目地址: https://github.com/chatchat-space/Langchain-Chatchat 整体安装比较方便,在阿里云购买云主机,购买的国外站点机器, 该项目运行最佳坏境为 Linux Ubuntu 22.04.5Python 版本 3.11.7CUDA 版本: 12.1torch2.1.2 使…

Spring的优点

1.方便解耦,简化开发 Spring就是一个容器,可以将所有对象创建和关系维护交给Spring管理。 2.AOP编程支持 面向切面编程,方便实现程序进行权限拦截,运行监控等功能。 3.声明式事务的支持 通过配置完成事务的管理,…

Web UI自动化测试原理

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

每日五道java面试题之spring篇(六)

目录: 第一题 ApplicationContext通常的实现是什么?第二题 什么是Spring的依赖注入?第三题 依赖注入的基本原则第四题 依赖注入有什么优势?第五题 有哪些不同类型的依赖注入实现方式? 第一题 ApplicationContext通常的…