使用RV1126交叉编译工具链交叉编译opencv,c++代码直接调用VideoCapture 读取摄像头数据

使用RV1126交叉编译工具链交叉编译opencv,rv1126直接调用VideoCapture 读取摄像头数据

    • 前言
    • 环境
    • 一、ubantu安装
    • 二、交叉编译工具安装
    • 三、cmake升级
    • 四、ffmpeg安装
    • 五、opencv安装
    • 六、c++代码测试(上板运行)

前言

交叉编译是一种将软件在操作系统上进行编译,但在另一种不同的操作系统或架构上运行的技术。本文将使用Ubuntu作为主机操作系统,并将OpenCV编译为在另一个目标平台上运行的库。
经过测试,rv1126开发板上的opencv似乎安装的不够完整,没法使用高级的opencv类,导致想调用VideoCapture 函数读取摄像头数据进行模型推理失败(ps:嫌交叉编译opencv麻烦的,也可以使用Linux操作系统中用于支持摄像头和视频设备的框架:v4l2。可以比较方便的读取摄像头数据,不需要做什么配置,教程直接参考正点原子官网中的文档:https://pan.baidu.com/s/1inZtndgN-L3aVfoch2-sKA#list/path=%2F,提取码:m65i,里面有一个文档,名字是:【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1。想搞懂v4l2代码的话,建议先看第一章、第二章、第四章、第十四章的存储映射IO,最后再看第二十六章,跟着26.2写代码就可以运行,如果还想将图像实时显示到LCD屏幕上的话还需要看第十八章、二十章)。言归正传,我也根据第二十六章的教程实现了摄像头的读取,代码逻辑清晰比较简单,但是真正使用起来肯定还是没有直接opencv调库方便的,所以做了本篇博客的这件事,实现ubantu交叉编译opencv,使得编译的可执行程序在板子上可以使用opencv的高级函数,简化编程。

环境

ubuntu20.04
cmake:3.22.6
交叉编译工具:gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf
opencv:4.5.3

一、ubantu安装

本篇博客使用ubuntu20.04,镜像下载地址:https://releases.ubuntu.com/20.04/
VMWARE安装ubuntu的教程参考:
https://www.bilibili.com/video/BV1W34y1k7ge/?spm_id_from=333.337.search-card.all.click

二、交叉编译工具安装

交叉编译是一种将软件在操作系统上进行编译,但在另一种不同的操作系统或架构上运行的技术:交叉编译器使得我们在主机上能够编译出可以在嵌入式设备上运行的程序。本文的目的也就是这个,在ubuntu编译的可执行程序放到RV1126开发板运行。
下载地址:https://developer.arm.com/downloads/-/gnu-a,进入网页往下翻找到:
在这里插入图片描述
这网站可能需要梯子才能进,可以在windows中下载然后传到ubantu中(filiza、u盘)。
在/home目录中新建RV1126文件夹,将此压缩包放到此文件夹中执行以下命令解压:

 xz -d gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xztar -xvf gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar

解压完成后将此工具的bin文件夹目录写入到/.bashrc文件中,也就是设置环境变量:

sudo gedit ~/.bashrc           //编辑bash
export PATH=/home/wzq/RV1126/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin:$PATH            //将此行添加到bash的最后,注意路径要改成自己的
source ~/.bashrc           //重新执行刚修改的bash文件,使之立即生效

三、cmake升级

ubuntu自带cmake,但是版本过低,这里其实不升级应该也没有影响,但是以后如果想部署深度学习模型到rv1126的话还会用到ubuntu的,此时就有要求cmake的版本不能过低,所以这里直接升级。
下载地址:https://cmake.org/files/v3.22/
在这里插入图片描述
将此压缩包放到RV1126文件夹下,解压:

tar -zxvf cmake-3.22.6-linux-x86_64.tar.gz

接下来执行升级:

cd cmake-3.22.6-linux-x86_64
cd share
sudo cp -r cmake-3.22 /usr/share
cd ..
cd bin
sudo cp cmake /usr/bin/cmake
sync
cmake --version                       //执行这条命令看到cmake的版本是3.22.6的话就表示升级成功了。

在这里插入图片描述

四、ffmpeg安装

未安装ffmpeg的话就没法使用opencv相关读图/视频等相关功能,所以在安装opencv之前先安装ffmpeg。
下载地址:http://www.ffmpeg.org/download.html,下载3.4.13这个版本,如果能找到3.4.8最好。
在这里插入图片描述
同样将此压缩包放到RV1126文件夹下解压:

tar -zxvf ffmpeg-3.4.8.tar.gz

安装它之前需要先安装yasm汇编器,如果不装yasm的话安装过程就会报错:yasm/nasm not found or too old. Use --disable-yasm for a crippledbuild。下载地址:http://www.tortall.net/projects/yasm/releases
在这里插入图片描述
1)将yasm压缩包也放到RV1126文件夹中解压:

tar -zxvf yasm-1.3.0.tar.gz

2)进入yasm文件夹

cd yasm-1.3.0

3)配置yasm

./configure

4)编译、安装yasm

make
make install

1)yasm安装完成后进到ffmpeg-3.4.8目录下:

cd  ..
cd ffmpeg-3.4.8

2)配置ffmpeg

./configure --enable-shared --prefix=/usr/local/ffmpeg               //prefix指定安装路径

3)编译、安装ffmpeg

make
make install

安装完成之后应该可以在/usr/local/ffmpeg/目录下看到如下四个文件夹:
在这里插入图片描述
其中bin是ffmpeg主程序二进制目录,include是C/C++头文件目录,lib是编译好的库文件目录,share是文档目录。
安装完成之后需要手动将这里的lib目录链接到系统库中:

cd /etc/ld.so.conf.d 
touch ffmpeg.conf 
sudo gedit  ffmpeg.conf 

在打开的文件中输入:

/usr/local/ffmpeg/lib

保存之后终端输入:ldconfig 使配置立刻生效,此时回到/usr/local/ffmpeg/bin目录中执行:

./ffmpeg -version

可以看到当前ffmpeg的版本信息:
在这里插入图片描述
最后就是设置环境变量,否则安装opencv时会找不到ffmpeg依赖:

sudo gedit /etc/profile                        //打开文件
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/ffmpeg/lib/pkgconfig                    //在打开的文件最后一行添加环境变量
source /etc/profile                   //使环境变量立刻生效

此时ffmpeg的安装才算大功告成。

五、opencv安装

下载地址:https://opencv.org/releases/
在这里插入图片描述
在这里插入图片描述
同样将此压缩包放到RV1126文件夹下,解压并进入:

unzip opencv-4.5.3.zip
cd opencv-4.5.3

新建build文件夹并进入:

mkdir build
cd build

此时开始cmake,如果报错说格式有问题,就把所有D后的空格删了:

cmake -D CMAKE_BUILD_TYPE=RELEASE  -D CMAKE_C_COMPILER=arm-linux-gnueabihf-gcc -D CMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++ -D BUILD_SHARED_LIBS=ON -D CMAKE_CXX_FLAGS=-fPIC -D CMAKE_C_FLAGS=-fPIC -D CMAKE_EXE_LINKER_FLAGS=-lpthread -ldl -D ENABLE_PIC=ON -D WITH_1394=OFF -D WITH_ARAVIS=OFF -D WITH_ARITH_DEC=ON -D WITH_ARITH_ENC=ON -D WITH_CLP=OFF -D WITH_CUBLAS=OFF -D WITH_CUDA=OFF -D WITH_CUFFT=OFF -D WITH_FFMPEG=ON -D WITH_GSTREAMER=ON -D WITH_GSTREAMER_0_10=OFF -D WITH_HALIDE=OFF -D WITH_HPX=OFF -D WITH_IMGCODEC_HDR=ON -D WITH_IMGCODEC_PXM=ON -D WITH_IMGCODEC_SUNRASTER=ON -D WITH_INF_ENGINE=OFF -D WITH_IPP=OFF -D WITH_ITT=OFF -D WITH_JASPER=ON -D WITH_JPEG=ON -D WITH_LAPACK=ON -D WITH_LIBREALSENSE=OFF -D WITH_NVCUVID=OFF -D WITH_OPENCL=OFF -D WITH_OPENCLAMDBLAS=OFF -D WITH_OPENCLAMDFFT=OFF -D WITH_OPENCL_SVM=OFF -D WITH_OPENEXR=OFF -D WITH_OPENGL=OFF -D WITH_OPENMP=OFF -D WITH_OPENNNI=OFF -D WITH_OPENNNI2=OFF -D WITH_OPENVX=OFF -D WITH_PNG=OFF -D WITH_PROTOBUF=OFF -D WITH_PTHREADS_PF=ON -D WITH_PVAPI=OFF -D WITH_QT=OFF -D WITH_QUIRC=OFF  -D WITH_TBB=OFF -D WITH_TIFF=ON -D WITH_VULKAN=OFF -D WITH_WEBP=ON -D WITH_XIMEA=OFF -D CMAKE_INSTALL_PREFIX=./outputarm  -D WITH_GTK=OFF ..

cmake成功之后可以看到终端会有输出,如果是以下这两种情况,那就表明opencv可以执行读取视频的操作:
情况①
在这里插入图片描述
情况②
在这里插入图片描述
如果是下面这种情况,表面安装过程有错误,或者是安装的一些东西版本不兼容:
在这里插入图片描述
如果是上面这种全是no的情况,还有一种方法可以试试:将/usr/local/ffmpeg/lib/pkgconfig目录下的pc文件复制到/usr/local/lib/pkgconfig目录下,不过我有试过一次,是不行的,所以最好还是在前面的安装步骤自信一点,争取安装完就有前两种情况之一。
上面成功之后开始编译和安装:

sudo make -j4
sudo make install

成功之后就大功告成了。接下来写一个简单的c++代码进行测试!

六、c++代码测试(上板运行)

这里写一个简单的代码进行测试,按下键盘的enter键拍照。
home目录下新建test文件并进入:

mkdir test
cd test

新建test.cpp和CMakeLists.txt文件:

touch test.cpp
touch CMakeLists.txt

test.cpp内容如下:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>using namespace std;int main() {// 打开摄像头cv::VideoCapture cap(25);if (!cap.isOpened()) {cerr << "Error: Failed to open camera" << endl;return -1;}// 获取摄像头的分辨率int frameWidth = cap.get(cv::CAP_PROP_FRAME_WIDTH);int frameHeight = cap.get(cv::CAP_PROP_FRAME_HEIGHT);cout << "Camera resolution: " << frameWidth << "x" << frameHeight << endl;// 创建窗口cv::namedWindow("Camera", cv::WINDOW_NORMAL);// 读取图像并显示,等待按下 Enter 键拍照while (true) {cv::Mat frame;cap >> frame; // 读取一帧图像// 检查图像是否读取成功if (frame.empty()) {cerr << "Error: Failed to capture frame" << endl;//break;return 0;}// 检查是否按下 Enter 键int key = cv::waitKey(1);if (key == 13) { // 13 表示 Enter 键的 ASCII 码// 拍照并保存照片string filename = "photo.jpg";cv::imwrite(filename, frame);cout << "Photo saved as " << filename << endl;break; // 退出循环}}// 关闭摄像头cap.release();return 0;
}

CMakeLists.txt文件内容如下:

CMAKE_MINIMUM_REQUIRED(VERSION 3.22) #指定CMake编译最低要求版本PROJECT(test) #给项目命名set(CMAKE_SYSTEM_NAME Linux)# 设置opencv路径
SET(OpenCV_LIBS  /home/wzq/RV1126/opencv-4.5.3/build/outputarm/lib/)
SET(OpenCV_INCLUDE_DIRS /home/wzq/RV1126/opencv-4.5.3/build/outputarm/include/opencv4/) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s -O3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -s -O3")#指定头文件目录
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})#find_library(FUNC_LIB opencv_core /home/wzq/test/lib)#FILE(GLOB SRC_LIST_CPP ${PROJECT_SOURCE_DIR}/*.cpp)
#FILE(GLOB SRC_LIST_C ${PROJECT_SOURCE_DIR}/*.c)ADD_EXECUTABLE(test test.cpp)# 设置lib绝对路径库链接
link_directories(${OpenCV_LIBS})
target_link_libraries(test /home/wzq/RV1126/opencv-4.5.3/build/outputarm/lib/libopencv_core.so/home/wzq/RV1126/opencv-4.5.3/build/outputarm/lib/libopencv_imgproc.so/home/wzq/RV1126/opencv-4.5.3/build/outputarm/lib/libopencv_highgui.so/home/wzq/RV1126/opencv-4.5.3/build/outputarm/lib/libopencv_imgcodecs.so/home/wzq/RV1126/opencv-4.5.3/build/outputarm/lib/libopencv_videoio.so#${FUNC_LIB})

新建build文件夹并进入:

mkdir build
cd build

执行cmake,此时使用的就是交叉编译!再编译。

cmake  -D CMAKE_CXX_COMPILER=arm-linux-gnueabihf-g++  -D CMAKE_C_COMPILER=arm-linux-gnueabihf-gcc ..
make

此时成功的话会在build文件夹中生成一个可执行文件test!
要想在板子上可以运行这个可执行文件,还需要把用到的opencv库一并拷贝到板子上,这里就不选择了,直接把前面安装的opencv的所有库都复制上去,将build文件夹的内容也拷贝出来,opencv库的路径如下:
在这里插入图片描述
最终上板运行的文件内容如下:
在这里插入图片描述
红色是可执行程序,蓝色是build文件夹的文件,其余的就是opencv库。

上板运行
将代码传至开发板的方法有多种:
①adb
②挂载(nfs)
③远程登陆
不管使用哪种,只要能把此文件夹传至开发板端即可。进入代码文件夹:

chmod 777 test          //给予可执行权限
./test          //运行代码

此时按下enter键即可将当前摄像头画面保存为jpg文件,在当前目录下。

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

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

相关文章

关于docker无法正常下载镜像的问题

文章目录 之前还可以正常下载镜像&#xff0c;但是一段时间之后就无法下载了&#xff0c;猜测可能是政治原因&#xff0c;无法连接到国外服务器&#xff0c;所以我设置了阿里云的镜像加速器。 配置方法如下&#xff1a; 前往阿里云&#xff08;https://help.aliyun.com/zh/acr/…

ATA-3040C功率放大器的正确使用方法

功率放大器是一种用于增强电信号功率的重要设备。正确使用功率放大器可以确保信号的稳定放大&#xff0c;并避免设备损坏。下面将介绍功率放大器的正确使用方法。 确定输入信号的功率范围&#xff1a;在使用功率放大器之前&#xff0c;需要确定输入信号的功率范围。过大的输入功…

Python 最强的5个高级函数,你会几个?

Python是一门灵活而强大的编程语言&#xff0c;具有丰富的内置函数和库。今天&#xff0c;我们将深入探讨五个非常有用的Python高级函数。这些函数不仅能够简化代码&#xff0c;还能提高代码的可读性和可维护性。 首先&#xff0c;了解下什么是高级函数&#xff1f; 高级函数…

【Unity】如何做一个很平滑的行人动画,且可以根据行人速度动态调整动画速度?

首先我们定一下不同速度对应的行人动作状态&#xff0c;设计为四种状态&#xff1a; 静止站立Stand&#xff1a;0~maxStandSpeed走路Walk&#xff1a;minWalkSpeed~maxWalkSpeed慢跑Jog&#xff1a;minJogSpeed~maxJogSpeed快跑Run&#xff1a;大于MinRunSpeed 我们可以使用A…

FISCO BCOS x GitLink,为国产开源技术生态注入新活力

作为中国领先的区块链底层平台之一&#xff0c;FISCO BCOS 自成立以来始终致力于推动国产开源区块链技术的应用和普及。近期&#xff0c;FISCO BCOS 将开源代码托管到CCF官方代码托管平台 GitLink &#xff08;确实开源&#xff09;&#xff0c;为国产开源技术生态注入新活力。…

刚实习的大学生如何避免招聘骗局?

大学生在求职过程中&#xff0c;常常成为招聘骗局的受害者。为了避免这种情况&#xff0c;大学生需要提高警惕&#xff0c;采取一系列措施来防范招聘骗局。以下是一些建议&#xff1a; 首先&#xff0c;大学生应当保持警惕&#xff0c;不轻信招聘信息。在求职时&#xff0c;务…

使用 Elasticsearch 设计大规模向量搜索

作者&#xff1a;Jim Ferenczi 第 1 部分&#xff1a;高保真密集向量搜索 简介 在设计向量搜索体验时&#xff0c;可用选项的数量之多可能会让人感到不知所措。最初&#xff0c;管理少量向量很简单&#xff0c;但随着应用程序的扩展&#xff0c;这很快就会成为瓶颈。 在本系列…

ip地址公和内有什么区别

在数字化世界中&#xff0c;IP地址扮演着至关重要的角色。它不仅是网络设备的身份标识&#xff0c;更是信息传输的桥梁。然而&#xff0c;并非所有IP地址都拥有相同的属性和功能。公有IP地址和私有IP地址&#xff0c;作为IP地址的两大类别&#xff0c;它们存在着显著的差异。虎…

成都百洲文化传媒有限公司电商服务的领航者

在当今数字化浪潮席卷全球的时代&#xff0c;电商行业以其独特的魅力和无穷的潜力&#xff0c;正成为推动经济发展的重要引擎。在这一领域&#xff0c;成都百洲文化传媒有限公司以其专业的电商服务和创新的营销理念&#xff0c;成为了行业的佼佼者&#xff0c;引领着电商服务的…

芯片后端对于芯片设计公司的重要性

在芯片设计流程中&#xff0c;后端设计是一个至关重要的环节&#xff0c;它直接关系到芯片从设计到实际生产的转化&#xff0c;以及最终产品的性能、可靠性、成本和上市时间。 以下是为什么芯片后端非常重要的几个关键原因&#xff1a; 物理实现&#xff1a;后端设计是芯片从逻…

CAP理论

CAP理论 在分布式系统的世界中&#xff0c;CAP理论是一个绕不开的话题。CAP&#xff0c;即Consistency&#xff08;一致性&#xff09;、Availability&#xff08;可用性&#xff09;和Partition tolerance&#xff08;分区容错性&#xff09;&#xff0c;这三个属性在分布式系…

Vxe UI vxe-table custom 实现自定义列服务端保存,服务端恢复状态,实现用户个性化列信息保存

Vxe UI vue vxe-table custom 实现自定义列服务端保存&#xff0c;服务端恢复状态&#xff0c;实现用户个性化列信息保存 支持将自定义列状态信息&#xff0c;列宽、冻结列、列排序、列显示隐藏 等状态信息保存到本地或服务端 代码 实现自定义列状态保存功能&#xff0c;只需…

在气膜建筑中运动,我们会感觉到不舒服吗—轻空间

气膜建筑是一种以膜材为主要结构&#xff0c;通过空气压力支撑的新型建筑形式&#xff0c;广泛应用于体育场馆、游泳馆和多功能运动场等领域。然而&#xff0c;人们常常担心在这种建筑中运动是否会感到不适。本文将探讨气膜建筑中运动的舒适度问题&#xff0c;并结合相关的技术…

GaN VCSEL:工艺革新引领精准波长控制新纪元

日本工程师们凭借精湛的技艺&#xff0c;开创了一种革命性的生产工艺&#xff0c;让VCSEL的制造达到了前所未有的高效与精准。这一成果由名城大学与国家先进工业科学技术研究所的精英们联手铸就&#xff0c;将氮化镓基VCSELs的商业化进程推向了新的高峰。它们将有望成为自适应前…

Spring Cloud 之 GateWay

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言前言1、通过API网关访问服务2、Spring Cloud GateWay 最主要的功能就是路由…

Java中json字符串与json对象

1、json本质 json是一种数据交换格式。 常说的json格式的字符串 > 发送和接收时都只是一个字符串&#xff0c;它遵循json这种格式。 2、前后端交互传输的json是什么&#xff1f; 前后端交互传输的json都是json字符串 比如&#xff1a; 2.1响应过程&#xff1a;后端响应…

JVM的几种常见垃圾回收算法

引言&#xff1a; Java Virtual Machine&#xff08;JVM&#xff09;作为Java程序运行的核心&#xff0c;其垃圾回收&#xff08;Garbage Collection, GC&#xff09;机制在内存管理中起着至关重要的作用。垃圾回收算法是JVM性能优化的重要方面。本文将详细介绍几种常见的垃圾回…

ui自动化中,几种文件上传整理2024

input标签的 对于input标签实现的文件上传&#xff0c;看成输入框&#xff0c;直接send_keys 非input标签的 要使用第三方库&#xff1a; 方式1&#xff1a; pip install pypiwin32 要点&#xff1a;图片路径要写路径 方式2&#xff1a;pip install pyautogui 方式3&#…

打造你的专属扭蛋机:淘宝扭蛋机小程序搭建全攻略

想要在互联网娱乐领域大展拳脚吗&#xff1f;淘宝扭蛋机小程序或许是你的不二选择。本文将为你提供详细的搭建教程&#xff0c;帮助你轻松打造属于自己的扭蛋机小程序。 一、了解扭蛋机小程序的基本原理 在开始搭建之前&#xff0c;我们需要了解扭蛋机小程序的基本原理。扭蛋机…

Vue26-内置指令03:v-cloak指令

一、需求 将引入本地JS的代码&#xff0c;换成引入外部JS&#xff0c;且引入的外部JS要等待5S。 【备注】&#xff1a;浏览器也能调节网速 二、js阻塞 <body>的最下方也能引入JS&#xff1a; 此时&#xff0c;用户能在5S内看到root容器未编译的部分。 解决该问题&#x…