当前位置: 首页 > news >正文

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

背景:

       由于手上有一块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

5、测试




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 

大功告成

5、测试

CMakeLists.txt内容为:

cmake_minimum_required(VERSION 3.1)
project(opencv)
SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-std=c++11")
include_directories(/home/rock/opencv_test/install/include)
link_directories(/home/rock/opencv_test/install/lib)
#add_executable(opencv opencv.cpp)
add_executable(opencv opencv.cpp)
target_link_libraries(opencv /home/rock/opencv_test/install/lib/libopencv_highgui.so.3.4.5/home/rock/opencv_test/install/lib/libopencv_video.so.3.4.5/home/rock/opencv_test/install/lib/libopencv_core.so.3.4.5/home/rock/opencv_test/install/lib/libopencv_videoio.so.3.4.5 /home/rock/opencv_test/install/lib/libopencv_imgproc.so.3.4.5 /home/rock/opencv_test/install/lib/libopencv_imgcodecs.so.3.4.5)

其中opencv.cpp源代码内容为: 

#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include<bits/stdc++.h>
#include<arpa/inet.h>
#include<sys/socket.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(9123); // 服务器端口inet_pton(AF_INET, "192.168.0.111", &server_addr.sin_addr.s_addr);int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);if(sock_fd < 0)perror("");cv::VideoCapture capture; capture.open("limeng.mp4");cv::Size S = cv::Size(capture.get(cv::CAP_PROP_FRAME_WIDTH),capture.get(cv::CAP_PROP_FRAME_HEIGHT));//cv::VideoWriter wri("./wri.mp4", capture.get(cv::CAP_PROP_FOURCC), 30,S, true);//cv::VideoWriter wri("./wri.mp4", cv::VideoWriter::fourcc('M', 'P', '4', 'V') , 30,S, true);cv::VideoWriter wri("./wri.mp4", cv::VideoWriter::fourcc('m', 'p', '4', 'v') , 30,S, true);if (!capture.isOpened()){std::cout << "failed to open the video" << std::endl;return -1;}cv::Mat image;//摄像头读取的图像后续会进行压缩 这里进行压缩相关配置std::vector<int> quality;quality.push_back(CV_IMWRITE_JPEG_QUALITY);quality.push_back(30);//进行50%的压缩std::vector<uchar> data_encode;int cnt = 0 ;while(1){capture >> image ; if(image.cols <= 0 || image.rows <=0) return -1;wri << image;cnt ++ ;if(cnt > 1000) return -1;//printf("%d %d \n ", image.cols , image.rows);//imencode(".jpg", image, data_encode, quality);//将图像编码//int nSize = data_encode.size();//unsigned char *encodeImg = new unsigned char[nSize];//for (int i = 0; i < nSize; i++) { encodeImg[i] = data_encode[i]; }将unsigned char * 指针变量转化为const char * 指针变量 方便进行sendto函数调用//const char* p = (const char*)(char*)encodeImg;//sendto(sock_fd, p, nSize, 0, (struct sockaddr *) &server_addr, sizeof(server_addr));
}return 0;
}

编译结果为

 运行结果来看,经过交叉编译的Opencv是可以在目标arm平台上运行的

相关文章:

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

背景&#xff1a; 由于手上有一块rk3568的开发板&#xff0c;需要运行yolov5跑深度学习模型&#xff0c;但是原有的opencv不能对x264格式的视频进行解码&#xff0c;这里就需要将ffmpegx264编译进opencv。 但是开发板算力有限&#xff0c;所以这里采用在windows下&#xff0c;安…...

react之错误边界

错误边界实质是指什么 实际上是组件 错误边界捕获什么时候的错误 在渲染阶段的错误 错误边界捕获的是谁的错误 捕获的是子组件的错误 错误边界不能捕获什么错误 1、不能捕获异步代码 2、不能捕获事件处理函数 3、不能捕获服务端渲染 4、不能捕获自身抛出的错误 错误…...

openEuler系统之使用Keepalived+Nginx部署高可用Web集群

Linux系统之使用Keepalived+Nginx部署高可用Web集群 一、本次实践介绍1.1 本次实践简介1.2 本次实践环境规划二、keepalived介绍2.1 keepalived简介2.2 keepalived主要特点和功能2.3 使用场景三、Keepalived和Nginx介绍3.1 Nginx简介3.2 Nginx特点四、master节点安装nginx4.1 安…...

基于图像处理的滑块验证码匹配技术

滑块验证码是一种常见的验证码形式&#xff0c;通过拖动滑块与背景图像中的缺口进行匹配&#xff0c;验证用户是否为真人。本文将详细介绍基于图像处理的滑块验证码匹配技术&#xff0c;并提供优化代码以提高滑块位置偏移量的准确度&#xff0c;尤其是在背景图滑块阴影较浅的情…...

【JavaEE精炼宝库】文件操作(1)——基本知识 | 操作文件——打开实用性编程的大门

目录 一、文件的基本知识1.1 文件的基本概念&#xff1a;1.2 树型结构组织和目录&#xff1a;1.3 文件路径&#xff08;Path&#xff09;&#xff1a;1.4 二进制文件 VS 文本文件&#xff1a;1.5 其它&#xff1a; 二、Java 操作文件2.1 方法说明&#xff1a;2.2 使用演示&…...

常用排序算法_06_归并排序

1、基本思想 归并排序采用分治法 (Divide and Conquer) 的一个非常典型的应。归并排序的思想就是先递归分解数组&#xff0c;再合并数组。归并排序是一种稳定的排序方法。 将数组分解最小之后&#xff08;数组中只有一个元素&#xff0c;数组有序&#xff09;&#xff1b;然后…...

14-8 小型语言模型的兴起

过去几年&#xff0c;我们看到人工智能能力呈爆炸式增长&#xff0c;其中很大一部分是由大型语言模型 (LLM) 的进步推动的。GPT-3 等模型包含 1750 亿个参数&#xff0c;已经展示了生成类似人类的文本、回答问题、总结文档等能力。然而&#xff0c;虽然 LLM 的能力令人印象深刻…...

【Linux】:进程创建与终止

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关Linux程序地址空间的相关知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从…...

横截面交易策略:概念与示例

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…...

4.2 投影

一、投影和投影矩阵 我们以下面两个问题开始&#xff0c;问题一是为了展示投影是很容易视觉化的&#xff0c;问题二是关于 “投影矩阵”&#xff08;projection matrices&#xff09;—— 对称矩阵且 P 2 P P^2P P2P。 b \boldsymbol b b 的投影是 P b P\boldsymbol b Pb。…...

23种设计模式之装饰者模式

深入理解装饰者模式 一、装饰者模式简介1.1 定义1.2 模式类型1.3 主要作用1.4 优点1.5 缺点 二、模式动机三、模式结构四、 装饰者模式的实现4.1 组件接口4.2 具体组件4.3 装饰者抽象类4.4 具体装饰者4.5 使用装饰者模式4.6 输出结果&#xff1a; 五、 应用场景5.1 图形用户界面…...

数据结构--单链表实现

欢迎光顾我的homepage 前言 链表和顺序表都是线性表的一种&#xff0c;但是顺序表在物理结构和逻辑结构上都是连续的&#xff0c;但链表在逻辑结构上是连续的&#xff0c;而在物理结构上不一定连续&#xff1b;来看以下图片来认识链表与顺序表的差别 这里以动态顺序表…...

2024攻防演练:亚信安全推出MSS/SaaS短期定制服务

随着2024年攻防演练周期延长的消息不断传出&#xff0c;各参与方将面临前所未有的挑战。面对强大的攻击队伍和日益严格的监管压力&#xff0c;防守单位必须提前进行全面而周密的准备和部署。为应对这一形势&#xff0c;亚信安全特别推出了为期三个月的MSS/SaaS短期订阅方案。该…...

基于java+springboot+vue实现的在线课程管理系统(文末源码+Lw)236

摘要 本文首先介绍了在线课程管理系统的现状及开发背景&#xff0c;然后论述了系统的设计目标、系统需求、总体设计方案以及系统的详细设计和实现&#xff0c;最后对在线课程管理系统进行了系统检测并提出了还需要改进的问题。本系统能够实现教师管理&#xff0c;科目管理&…...

每日一更 EFK日志分析系统

需要docker和docker-compose环境 下面时docker-compose.yaml文件 [rootnode1 docker-EFK]# cat docker-compose.yaml version: 3.3services:elasticsearch:image: "docker.elastic.co/elasticsearch/elasticsearch:7.17.5"container_name: elasticsearchrestart: …...

python类继承和类变量

Python一些类继承和实例变量的使用 定义基类 class APIException:code 500msg "Sorry, error"error_code 999def __init__(self, msgNone):print("APIException init ...")def error_400(self):pass复用基类的属性值 class ClientTypeError(APIExcept…...

js 随机生成整数

随机生成一个唯一的整数 id export const randomId () > { return Date.now() Math.floor(Math.random() * 10000) } 生成随机ID的方法 // 随机生成0 - 9999 export const randomId ()> { return Math.floor(Math.random() * 10000).toString() } // 随机生成0-999之…...

深入Django(七)

Django的数据库迁移系统 引言 在前六天的教程中&#xff0c;我们介绍了Django的基本概念、模型、视图、模板、URL路由和表单系统。今天&#xff0c;我们将讨论Django的数据库迁移系统&#xff0c;它是管理和跟踪数据库变化的关键组件。 Django数据库迁移概述 Django的数据库…...

【区分vue2和vue3下的element UI Steps 步骤条组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Vue 2 和 Vue 3 中&#xff0c;Element UI&#xff08;针对 Vue 2&#xff09;和 Element Plus&#xff08;针对 Vue 3&#xff09;提供了 Steps 步骤条组件&#xff0c;用于展示当前操作的进度步骤。虽然这两个库都提供了步骤条组件&#xff0c;但它们在属性、事件和方法的…...

uni-app x 跨平台开发框架

目录 uni-app x 是什么 和Flutter对比 uts语言 uvue渲染引擎 组合式API的写法 选项式API写法 页面生命周期 API pages.json全局配置文件 总结 uni-app x 是什么 uni-app x&#xff0c;是下一代 uni-app&#xff0c;是一个跨平台应用开发引擎。 uni-app x 是一个庞…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...