【已解决】opencv 交叉编译 ffmpeg选项始终为NO

一、opencv 交叉编译没有 ffmpeg ,会导致视频打不开

在交叉编译时候,发现在 pc 端能用 opencv 打开的视频,但是在 rv1126 上打不开。在网上查了很久,原因可能是 交叉编译过程 ffmpeg 造成的。之前 ffmpeg 是直接用 apt 安装的,opencv 编译也是直接用 Cmake 命令行进行的。

网上特别推荐用命令行进行编译,但是本次交叉编译,我发现使用 CMake-gui 进行编译,能更好地找出错误,因为不管是警告还是错误,CMake-gui 都会用红字来表示。

解决opencv源代码编译找不到ffmpeg-CSDN博客

二、准备工作

创建一个目录:/opt/software,把 opencv4.5.5、x264、ffmpeg-4.x 都下载到该目录

再创建一个目录:/opt/out-arm,用作 x264、ffmpeg的安装目录

三、交叉编译x264

opencv交叉编译静态库,支持ffmpeg、libjpeg,实现取流及写入jpeg文件_交叉编译 生成静态库_程序员阿周的博客-CSDN博客

1、解压源码并且进入源码目录
2、编译动态库,目的是编译ffmpeg使用,命令如下:
#./configure --prefix=/opt/software/opencv --host=arm-linux --cross-prefix=arm-linux-gnueabihf- --disable-asm --enable-shared
#make -j6
#make install
3、编译静态库,目的是最后我们的应用程序链接使用,命令如下:
#./configure --prefix=/home/cxyazhou/work/opencv --host=arm-linux --cross-prefix=arm-linux-gnueabihf- --disable-asm
#make clean;make -j6
#make install

注意:静态库编译时,make install只会拷贝bin下的文件到install目录,所以这里需要手动拷贝头文件、静态库到install目录,基于上面已经编译了动态库,会自动拷贝头文件,这里我们只要拷贝静态库到install的lib目录就可以:

#cp libx264.a /opt/out-arm/lib/

四、交叉编译 ffmpeg

opencv交叉编译静态库,支持ffmpeg、libjpeg,实现取流及写入jpeg文件_交叉编译 生成静态库_程序员阿周的博客-CSDN博客

0、配置下环境变量,防止编译 ffmpeg 时候找不到 x264库

ffmpeg 编译问题记录-CSDN博客

#export PKG_CONFIG_PATH=/opt/out_arm/lib/pkgconfig/

1、解压源码并且进入源码目录
2、编译静态库,命令如下:
#./configure --cross-prefix=arm-linux-gnueabihf- --enable-cross-compile --target-os=linux --cc=arm-linux-gnueabihf-gcc --arch=arm64 --prefix=/opt/out-arm --enable-ffmpeg --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-asm --enable-swscale --enable-avresample --enable-gpl --enable-libx264 --extra-cflags=-I/opt/out-arm/include --extra-ldflags=-L/opt/out-arm/lib
#make -j6
#make install

五、交叉编译 OpenCV

opencv交叉编译包含ffmpeg_交叉编译 opencv ffmepg_思而后行之的博客-CSDN博客

Configure 前工作

按照上述块引用中的博客来,另外我还通过 Add Entry 指定了安装目录:

docker 容器中 /mnt 目录 会映射整个开发板

Configure

Configure 过程中的一些 Warning 不用太在意,只要 Configure 能完成就行:

检查 Configure 结果,FFMPEG 为 YES ,欧耶:

Generate

Generate 在上面的博客中没有报错,但是我这里报错:

CMake Error in modules/videoio/CMakeLists.txt:Imported target "ocv.3rdparty.ffmpeg" includes non-existent path
"/mnt/opt/software/opencv/include"in its INTERFACE_INCLUDE_DIRECTORIES.  Possible reasons include:* The path was deleted, renamed, or moved to another location.* An install or uninstall procedure did not complete successfully.* The installation package was faulty and references files it does notprovide.

解决方法是把 x264、 ffmpeg库的安装目录下的 include 文件夹的内容 copy 过去

# copy /opt/out-arm/include/*     /mnt/opt/software/opencv/include -r

在构建目录下执行的工作

Generate 完成后,关闭 cmkae-gui,回到构建目录,执行:

# make -j8

# make install

安装完毕:

六、检查是否能打开视频

CMakLists.txt

cmake_minimum_required(VERSION 2.8.4)STRING(REGEX REPLACE ".*/(.*)" "\\1" CURRENT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR} )
MESSAGE("current project: " ${CURRENT_FOLDER})set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_CROSSCOMPILING TRUE)cmake_host_system_information(RESULT arch_value QUERY OS_PLATFORM)if(NOT "${arch_value}" STREQUAL "armv7l")include ($ENV{HOME}/configs/cross.cmake)
endif()project(video_test)# 设置链接器路径
link_directories(/mnt/usr/lib/arm-linux-gnueabihf)set(CMAKE_PREFIX_PATH "/mnt/usr" ${CMAKE_PREFIX_PATH})
find_package(OpenCV REQUIRED)add_executable(video_test test.cpp )target_include_directories(video_test PUBLIC ${OpenCV_INCLUDE_DIRS} )
target_link_libraries(video_test  PRIVATE ${OpenCV_LIBS} /mnt/usr/lib/ogdi/libgdal.so)target_link_libraries(video_test PRIVATE -Wl,-rpath,/mnt/usr/lib/arm-linux-gnueabihf/)

test.cpp

#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{cv::VideoWriter outputVideo("/userdata/result.mp4",cv::VideoWriter::fourcc('m', 'p', '4', 'v'),double(1000/30),cv::Size(640,480));//    int camera_id =0;std::string video_path = "/userdata/test.avi";cv::VideoCapture camera(video_path);if(!camera.isOpened()){printf("camera %s cann't open\n", video_path.c_str());return 1;}elseprintf("camra %s opened\n", video_path.c_str());int frame_num = camera.get(cv::CAP_PROP_FRAME_COUNT);int frame=0;cv::Mat img;while(1){frame +=1;camera >> img;if (img.empty()){printf("camera cann't get image!\n");}//        cv::imshow("result", img);outputVideo.write(img);if(frame == frame_num - 2) break;}camera.release();outputVideo.release();return 0;
}

交叉编译的可执行文件,video_test 可以在开发板上打开视频文件:

七、其他

在编译和安装源代码时,常常会使用 pkg-config 工具来帮助 CMake 在构建过程中找到所需的库和头文件路径。pkg-config 是一个用于管理编译时和运行时依赖关系的工具,它提供了一个标准的接口来查询所需库的相关信息。

当安装一个库时,通常会将库的元数据信息(如库路径、版本号、依赖关系等)保存在对应的 .pc 文件中,并将该文件安装到系统的 pkg-config 目录中。pkg-config 目录是一个包含所有项目所需的 .pc 文件的目录,CMake 可以通过查询这些文件来获取库的信息。

在 CMake 中,可以使用 find_package 命令来查找并配置依赖库的设置。当传递库的名称给 find_package ,CMake 将通过 pkg-config 查询相应的库信息,并将结果存储在变量中,例如:

find_package(OpenCV REQUIRED)

上述代码中,find_package(OpenCV REQUIRED) 将在 pkg-config 目录中查找名为 opencv.pc 的文件,并从中提取出 OpenCV 库的信息,包括库的路径、版本号和所需的其他依赖关系。然后,CMake 将使用这些信息来配置 OpenCV 库的设置,以便在构建过程中可以找到和链接 OpenCV。

需要注意的是,并非所有的库都使用 pkg-config 进行管理和配置。有些库可能使用其他方式来提供编译和运行时的元数据信息,例如 CMake 配置文件或环境变量。因此,在使用特定库时,应查阅该库的文档或官方指南,以了解正确的配置方法。

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

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

相关文章

asp.net core 远程调试

大概说下过程&#xff1a; 1、站点发布使用Debug模式 2、拷贝到远程服务器&#xff0c;以及iis创建站点。 3、本地的VS2022的安装目录&#xff1a;C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\IDE下找Remote Debugger 你的服务器是64位就拷贝x64的目…

【从入门到起飞】IO高级流(1)(缓冲流,转换流,序列化流,反序列化流)

&#x1f38a;专栏【JavaSE】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f384;缓冲流&#x1f354;字节缓冲流&#x1f6f8;一次读取…

【通意千问】大模型GitHub开源工程学习笔记(1)--依赖库

9月25日&#xff0c;阿里云开源通义千问140亿参数模型Qwen-14B及其对话模型Qwen-14B-Chat,免费可商用。 立马就到了GitHub去fork。 GitHub&#xff1a; GitHub - QwenLM/Qwen: The official repo of Qwen (通义千问) chat & pretrained large language model proposed b…

协议栈——收发数据(拼接网络包,自动重发,滑动窗口机制)

目录 协议栈何时发送数据&#xff5e; 数据长度 IP模块的分片功能 发送频率 网络包序号&#xff5e;利用syn拼接网络包ack确认网络包完整 确定偏移量 服务器ack确定收到数据总长度 序号作用 双端告知各自序号 协议栈自动重发机制 大致流程 ack等待时间如何调整 是…

Leetcode202. 快乐数

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1&#xff0…

【单片机】13-实时时钟DS1302

1.RTC的简介 1.什么是实时时钟&#xff08;RTC&#xff09; &#xff08;rtc for real time clock) &#xff08;1&#xff09;时间点和时间段的概念区分 &#xff08;2&#xff09;单片机为什么需要时间点【一定的时间点干什么事情】 &#xff08;3&#xff09;RTC如何存在于…

Redis中Hash类的操作

Redis中Hash类型是键值对的形式保存数据&#xff0c;其中键被称为字段&#xff08;field&#xff09;&#xff0c;值称为字段值&#xff08;value&#xff09;。在一个key中&#xff0c;字段不能重复&#xff0c;而值可以重复。无论是字段还是值都是无序的&#xff08;保存的次…

Java 大厂八股文面试专题-JVM相关面试题 垃圾回收算法 GC JVM调优

Java 大厂八股文面试专题-JVM相关面试题 类加载器_软工菜鸡的博客-CSDN博客 3 垃圾收回 3.1 简述Java垃圾回收机制&#xff1f;&#xff08;GC是什么&#xff1f;为什么要GC&#xff09; 难易程度&#xff1a;☆☆☆ 出现频率&#xff1a;☆☆☆ 为了让程序员更专注于代码的实现…

【Flink】

事件驱动型应用 核心目标&#xff1a;数据流上的有状态计算 Apache Flink是一个框架和分布式处理引擎&#xff0c;用于对无界或有界数据流进行有状态计算。 运行逻辑 状态 把流处理需要的额外数据保存成一个“状态”,然后针对这条数据进行处理,并且更新状态。这就是所谓的“…

MySQL explain SQL分析工具详解与最佳实践

目录 一、explain工具介绍二、添加示例表和数据用于后续演示三、explain中的列3.1、id列3.2、select_type列3.3、table列3.4、partitions列3.5、type列NULLsystemconsteq_refrefrangeindexALL 3.6、possible_keys列3.7、key列3.8、key_len列3.9、ref列3.10、rows列3.11、filter…

HDFS最基础使用

文章目录 一、简介1、定义2、HDFS优缺点3、HDFS组成架构4、HDFS文件块大小 二、HDFS的读写流程1、HDFS写数据流程2、HDFS读数据流程3、网络拓扑-节点距离计算4、机架感知&#xff08;副本存储节点选择&#xff09; 三、NameNode和SecondaryNameNode1、NN和2NN工作机制2、Fsimag…

Linux关于gittee的远端仓库的连接和git三板斧

目录 1.网页操作 2.Linux操作 查看Linux系统中是否安装git指令 安装git指令 链接远端仓库 设置 .gitignore文件 3.git三板斧 1.网页操作 首先我们要在gittee建立一个仓库 这是我自己的勾选方案&#xff0c;大家可以参考一下。 这个方案勾选最下面的三个选项才有&#x…

java图书管理系统

一、 引言 图书管理系统是一个用于图书馆或书店管理图书信息、借阅记录和读者信息的应用程序。本系统使用Java Swing框架进行开发&#xff0c;提供直观的用户界面&#xff0c;方便图书馆管理员或书店工作人员对图书信息进行管理。以下是系统的设计、功能和实现的详细报告。 二…

最新整理源码面试题

经典框架源码面试题 Lecture&#xff1a;波哥 1.谈谈你对框架的理解 1.1 框架的作用 JavaWeb中的框架是一种开发工具或者平台&#xff0c;它提供了一系列的功能和组件&#xff0c;用于简化和加速Web应用的开发过程。框架可以提供一些基础设施&#xff0c;如数据库访问、用户认…

ISP图像信号处理——白平衡校正和标定介绍以及C++实现

从数码相机直接输出的未经过处理过的RAW图到平常看到的JEPG图有一系列复杂的图像信号处理过程&#xff0c;称作ISP&#xff08;Image Signal Processing&#xff09;。这个过程会经过图像处理和压缩。 参考文章1&#xff1a;http://t.csdn.cn/LvHH5 参考文章2&#xff1a;htt…

基于蜉蝣优化的BP神经网络(分类应用) - 附代码

基于蜉蝣优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于蜉蝣优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.蜉蝣优化BP神经网络3.1 BP神经网络参数设置3.2 蜉蝣算法应用 4.测试结果&#xff1a;5.M…

AAD基础知识(identity/token/PRT)

简介 AAD(Azure Active Directory/Azure AD)是微软基于云身份验证和访问控制的解决方案&#xff0c;通过SSO登录其他o365应用(word/outlook/teams…) 微软在2023年7月把AAD重命名为Microsoft Entra ID&#xff0c;官网&#xff1a;https://www.microsoft.com/zh-cn/security/b…

【多任务案例:猫狗脸部定位与分类】

【猫狗脸部定位与识别】 1 引言2 损失函数3 The Oxford-IIIT Pet Dataset数据集4 数据预处理4 创建模型输入5 自定义数据集加载方式6 显示一批次数据7 创建定位模型8 模型训练9 绘制损失曲线10 模型保存与预测 1 引言 猫狗脸部定位与识别分为定位和识别&#xff0c;即定位猫狗…

通过 HelpLook ChatBot AI自动问答机器人降低客户服务成本

在当今竞争激烈的商业环境中&#xff0c;提供卓越的客户服务对于维持忠诚的客户群和推动业务增长至关重要。客户服务涵盖了公司与其客户之间的所有互动&#xff0c;包括解答问题、解决问题和提供支持。它在塑造客户对品牌的看法方面起着关键作用&#xff0c;并且可以显著影响他…

C语言判断语句

判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 false。 下面…