虚拟机交叉编译基于ARM平台的opencv(ffmpeg/x264)

news2024/12/23 8:46:11

背景:

       由于手上有一块rk3568的开发板,需要运行yolov5跑深度学习模型,但是原有的opencv不能对x264格式的视频进行解码,这里就需要将ffmpeg+x264编译进opencv。

      但是开发板算力有限,所以这里采用在windows下,安装ubuntu的虚拟机,在虚拟机上进行交叉编译,得到arm 版的opencv。

pc主机:windows10

虚拟机:ubuntu-18.04

目标机:  armv8

目标芯片:rk3568

目标编译环境: aarch64-linux-gnu-gcc/aarch64-linux-gnu-g++

注:以下所有的环境安装都是在虚拟机上运行的,目标ARM平台需要另外安装运行环境

目录

1、安装交叉编译器和编译工具

2、下载+编译依赖的第三方软件

3、设定第三方软件统一的安装路径和编译安装软件

4、编译opencv



1、安装交叉编译器和编译工具
sudo apt-get install g++-aarch64-linux-gnu
sudo apt-get install gcc-aarch64-linux-gnu
sudo apt-get install cmake-gui  cmake
sudo apt-get install build-essential
sudo apt-get install vim
sudo apt install pkg-config
2、下载+编译依赖的第三方软件
zlib官网:http://www.zlib.net/
libjpeg下载地址:http://www.ijg.org/files/
libpng下载地址:http://www.libpng.org/pub/png/libpng.html
yasm下载地址:http://yasm.tortall.net/Download.html
x264下载地址:http://www.videolan.org/developers/x264.html
libxvid下载地址:http://ftp.br.debian.org/debian-multimedia/pool/main/x/xvidcore/
ffmpeg下载地址:http://ffmpeg.org/download.html

这里将对应的软件下载下来就行,软件版本的话,我这边选的稍微稳定的版本

软件版本我这边的截图如下:

3、设定第三方软件统一的安装路径和编译安装软件

     为什么要设定安装路径?一是方便管理,当依赖的第三方软件都编译成功后,可以统一将所有的lib库文件和include


头文件复制到目标文件夹

   为什么要交叉编译安装软件?因为我们要编译arm版本的opencv,该opencv依赖的第三方软件也需要是arm版本的,由于宿主主机是x86架构的,所以只能交叉编译安装

注:编译安装的命令行参数配置

    --host: 指明目标平台

    --prefix: 指明编译安装的位置

    --enable-shared  生成动态库

     --enable-static  生成静态库

  声明软件的安装位置,以及目标平台使用的 c 语言编译软件平台

vim ~/.bashrc
export OPENCV_DEPEND=/usr/local/arm/opencv-depend
export OPENCV_INSTALL=/usr/local/arm/opencv-install
export CC=aarch64-linux-gnu-gcc
source ~/.bashrc

  这里我将CC=aarch64-linux-gnu,这样的话,后续采用configure编译得到的Makefile文件里面的CC都会由gcc改成aarch64-linux-gnu,就不用每次都去Makefile文件里面去改相应的字段了 

    编译安装zlib

cd  zlib-1.3.1/
./configure --prefix=$OPENCV_DEPEND  --host=aarch64-linux-gnu
sudo maks && sudo make install

   编译安装libjpeg

cd jpeg-8
./configure --host=aarch64-linux-gnu --prefix=$OPENCV_DEPEND --enable-shared --enable-static
sudo make  && sudo make install 

 虽然指令写的没问题,编译也没有问题,但是我后面编译Opencv时,却找不到 ljpeg  , 就算我指明了对应的库位置,也不行,所以这一步就当失败了。后面我会有解决方案解决这个问题:那就是将

 编译安装libpng

cd libpng-1.4.21/
./configure --host=aarch64-linux-gnu --prefix=$OPENCV_DEPEND --enable-shared --enable-static
sudo make && sudo make install 

编译安装x264

cd x264-master/
./configure --enable-shared --host=aarch64-linux-gnu --disable-asm --prefix=$OPENCV_DEPEND
sudo  make && sudo make install 

x264 是一个很重要的依赖,用于对 x264 编码格式的码流进行解码,我们需要将x264编译进Opencv

编译libxvid

./configure --prefix=$OPENCV_DEPEND --host=arm-linux --disable-assembly
make
make install

编译ffmpeg

./configure --prefix=$OPENCV_DEPEND --enable-shared --disable-static --enable-gpl --enable-cross-compile --arch=arm --disable-stripping --target-os=linux --enable-libx264 --enable-libxvid --cc=arm-linux-gcc --enable-swscale --extra-ldflags=-L$OPENCV_DEPEND/lib --extra-cflags=-I$OPENCV_DEPEND/include

前面已经将一些依赖的第三方软件都安装完成,现在需要将这些依赖包含的头文件include和库文件 lib,都复制到aarch64-gcc的指定路径下,方便编译opencv时能找到

sudo cp -r /usr/local/arm/$OPENCV_DEPEND/include/    /usr/aarch64-linux-gnu/include/
sudo cp -r /usr/local/arm/$OPENCV_DEPEND/lib/   /usr/aarch64-linux-gnu/lib
4、编译opencv

1、获取opencv源码,我这里的源代码版本是opencv-3.4.5

mkdir mybudild 
cd mybuild 
vim toolchain.cmake

 将以下内容填进去

###########user defined#############
set( CMAKE_SYSTEM_NAME Linux )
set( CMAKE_SYSTEM_PROCESSOR arm )
set( CMAKE_C_COMPILER arm-none-linux-gnueabi-gcc )
set( CMAKE_CXX_COMPILER arm-none-linux-gnueabi-g++ )
###########user defined#############
set( CMAKE_FIND_ROOT_PATH "/usr/local/arm/opencv-depend" )
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
######################################

在新建的mybuild文件夹下键入命令cmake-gui

我的路径是 /home/rock/src/opencv-3.4.5/mybuild2

cmake-gui通过Add Entry按钮添加OPENCV_ENABLE_PKG_CONFIG,选择类型为bool并打钩

将以下内容填进去去掉 WITH_CUDA
去掉 WITH_GTK
去掉 WITH_1394
去掉 WITH_GSTREAMER
去掉 WITH_LIBV4L
去掉 WITH_TIFF
去掉 BUILD_OPENEXR
去掉 WITH_OPENEXR
去掉 BUILD_opencv_ocl
去掉 WITH_OPENCL

勾选BUILD_JPEG

这里增加勾选BUILD_JPEG刚好解决我前面编译ljpeg后,CMAKE链接不到的问题

完成后

vim CMakeCache.txt

将该行改成

CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING=-lpthread -lrt

sudo make  && make install 

大功告成

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

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

相关文章

2024年07年01日 Redis数据类型以及使用场景

String Hash List Set Sorted Set String,用的最多,对象序列化成json然后存储 1.对象缓存,单值缓存 2.分布式锁 Hash,不怎么用到 1.可缓存经常需要修改值的对象,可单独对对象某个属性进行修改 HMSET user {userI…

Element中的选择器组件Select (一级选择组件el-select)

简述&#xff1a;在 Element UI 中&#xff0c;ElSelect&#xff08;或简称为 Select&#xff09;是一个非常常用的选择器组件&#xff0c;它提供了丰富的功能来帮助用户从一组预定义的选项中选择一个或多个值。这里来简单记录一下 一. 组件和属性配置 <el-selectv-model&q…

经典FC游戏web模拟器--EmulatorJS

简介 EmulatorJS是一个基于JavaScript和Webassembly技术的虚拟环境的实现&#xff0c;可以在网页中运行各种经典FC游戏系统&#xff0c;支持任天堂、世嘉、雅达利等经典红白机。EmulatorJS的诞生使得诸如超级玛丽、坦克大战、魂斗罗等经典FC游戏能够以一种全新的方式回归。本文…

MySQL:高效的索引

数据库索引 1. 索引介绍1.1 创建索引1.2 查看索引 2. 索引应用2.1 前缀索引2.2 全文索引2.3 复合索引2.4 复合索引中的列顺序2.5 建立最佳索引2.6 使用索引排序2.7 覆盖索引 3. 维护索引4. 建立性能数据库 索引对大型和高并发数据库非常有用&#xff0c;因为它可以显著提升查询…

KVM虚拟机动态添加网卡

一、在宿主机上临时在线添加虚拟网卡&#xff0c;关机再开机失效 1、查看运行的虚拟机 [rootlocalhost img]# virsh list 2、添加NAT网卡&#xff0c;会自动获取192.168.122.X网段的IP virsh attach-interface hadoop01 --type network --source default 3、查看虚机mac …

vue+element-ui简洁完美实现个人博客“​响石潭 ​”

目录 一、项目介绍 二、项目截图 1.项目结构图 2.首页 3.生活 ​编辑 4.文章详情 ​编辑 5.关于我 ​编辑 ​编辑 三、源码实现 1.项目依赖package.json 2.项目启动 3.首页源码 四、总结 一、项目介绍 本项目在线预览&#xff1a;点击访问 参考官网&#xff1…

360的chromesafe64.dll动态链接库导致chrome和edge浏览器闪退崩溃关闭

在chrome或edge浏览器中打开特定的一些网页会导致浏览器闪退关闭 这是windows系统记录的报错日志 chrome报错日志 edge报错日志 日志指向的就是chromesafe64.dll这个动态库 然后用everything搜索发现原来在360安装目录下 360安装目录下的chromesafe64.dll文件 为什么360中的…

使用TensorFlow进行OCR识别:将表格图片转换为结构化数据

随着人工智能和机器学习技术的不断发展&#xff0c;OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术已经成为处理图像中文本信息的强大工具。TensorFlow是一个广泛使用的开源机器学习框架&#xff0c;它提供了丰富的API和工具&#xff…

独立开发者系列(17)——MYSQL的常见异常整理

虽然安装MYSQL到本地很简单&#xff0c;但是数据库报错还是经常出现&#xff0c;这个时候&#xff0c;需要我们进行逐步检查与修复。作为我们最常用的开发软件&#xff0c;无论切换php/go/python/node/java&#xff0c;数据库的身影都少不了&#xff0c;对于我们储存数据而言&a…

Android 如何通过一个设备开发多种分辨率屏幕UI

获取当前屏幕密度&#xff1a; adb shell wm density 获取当前分辨率&#xff1a; adb shell wm size 重置设备密度和分辨率 adb shell wm size reset adb shell wm density reset 屏幕1 adb shell wm size 3082x934 adb shell wm density 160 屏幕2 adb shell wm siz…

【数据结构与算法】利用堆结构高效解决TopK问题

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​ 目录 一、引言 二、堆的基本概念 三、使用堆解决TopK问题 四、算法实现&#xff08;C语言…

HTTPS基础

目录 1. HTTPS概述2. HTTPS工作原理3. HTTPS证书4. HTTPS安全性特性5. 配置HTTPS示例5.1 获取和配置SSL/TLS证书5.2 示例&#xff1a;在Nginx上配置HTTPS5.3 实施HSTS 6. 结论 1. HTTPS概述 术语描述HTTPS超文本传输安全协议&#xff0c;HTTP的安全版本。SSL/TLS安全套接字层/…

UG NX二次开发(C++)-根据草图创建拉伸特征(UFun+NXOpen)

1、前言 UG NX是基于特征的三维建模软件,其中拉伸特征是一个很重要的特征,有读者问如何根据草图创建拉伸特征,我在这篇博客中讲述一下草图创建拉伸特征的UG NX二次开发方法,感兴趣的可以加入QQ群:749492565,或者在评论区留言。 2、在UG NX中创建草图,然后创建拉伸特征 …

uniapp + vue3 + Script Setup 写法变动 (持续更新)

一、uniapp 应用生命周期&#xff1a; https://uniapp.dcloud.net.cn/tutorial/vue3-composition-api.html 注意&#xff1a; 应用生命周期仅可在App.vue中监听&#xff0c;在其它页面监听无效。 二 、uniapp页面生命周期&#xff1a; https://uniapp.dcloud.net.cn/tutori…

电商控价:系统监测的必要性与优势

在品牌的发展进程中&#xff0c;会遭遇各种各样的渠道问题&#xff0c;控价乃是其中颇为关键的一环。品牌进行控价的目的无疑是为了妥善治理低价链接&#xff0c;低价链接的发现途径可以是人工&#xff0c;也可以是系统。力维网络在为上百个品牌提供服务的过程中察觉到&#xf…

中南大学湘雅三院张如旭/刘爱华团队发现牙髓干细胞来源的外泌体减轻脑缺血再灌注损伤的神经保护机制

随着我国人口老龄化的加剧&#xff0c;中风已成为我国主要的公共卫生疾病之一&#xff0c;确定其潜在的分子机制和治疗靶点对于开发有效的预防和治疗策略至关重要。近期&#xff0c;中南大学湘雅第三医院张如旭、刘爱华团队在经典权威期刊《Pharmacological Research》&#xf…

在 Mac 上使用 MLX 微调微软 phi3 模型

微调大语言模型是常见的需求&#xff0c;由于模型参数量大&#xff0c;即使用 Lora/Qlora 进行微调也需要 GPU 显卡&#xff0c;Mac M系是苹果自己的 GPU&#xff0c;目前主流的框架还在建立在 CUDA 的显卡架构&#xff0c;也就是主要的卡还是来自英伟达。如果要用 Mac 来做训练…

【AI提升】如何使用大模型:本机离线和FastAPI服务调用

大模型本身提供的功能&#xff0c;类似于windows中的一个exe小工具&#xff0c;我们可以本机离线调用然后完成具体的功能&#xff0c;但是别的机器需要访问这个exe是不可行的。常见的做法就是用web容器封装起来&#xff0c;提供一个http接口&#xff0c;然后接口在后端调用这个…

单目行车测距摄像系统(单目测距-行车)

单目行车测距摄像系统是一种利用单个摄像头实现车辆行驶中前方障碍物距离测量的技术。该系统通过计算机视觉算法&#xff0c;能够实时分析摄像头捕捉的图像&#xff0c;精确计算出车辆与前方物体之间的距离&#xff0c;对于自动驾驶、高级驾驶辅助系统&#xff08;ADAS&#xf…

为什么说AI大模型开发人人必备?

首先&#xff0c;能够开发 AGI 时代新应用程序 第一步&#xff1a;学会大模型内核架构&#xff0c;对 Transformer 神经网络架构有个大致的了解&#xff0c;能够搞懂 &#xff1a;LLM 大模型是如何预测下一个 token 的、涌现是如何产生的、幻觉问题如何避免、在线推理的性能问…