当前位置: 代码网 > it编程>编程语言>Java > 【瑞芯微RV1126(板端摄像头图像数据采集)】①使用RV1126交叉编译工具链交叉编译opencv,c++代码直接调用VideoCapture 采集图像数据

【瑞芯微RV1126(板端摄像头图像数据采集)】①使用RV1126交叉编译工具链交叉编译opencv,c++代码直接调用VideoCapture 采集图像数据

2024年08月04日 Java 我要评论
交叉编译是一种将软件在操作系统上进行编译,但在另一种不同的操作系统或架构上运行的技术。本文将使用Ubuntu作为主机操作系统,并将OpenCV编译为在另一个目标平台上运行的库。经过测试,rv1126开发板上的opencv似乎安装的不够完整,没法使用高级的opencv类,导致想调用VideoCapture 函数读取摄像头数据进行模型推理失败(ps:嫌交叉编译opencv麻烦的,也可以使用Linux操作系统中用于支持摄像头和视频设备的框架:v4l2。可以比较方便的读取摄像头数据,不需要做什么配置,教程直接参考

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

前言

***本系列的目的是,不仅仅将能够进行图片推理的模型部署于板端,还提供了两种摄像头数据采集的方法,集成到自己的深度学习推理代码之后,可以根据应用场景的不同实现按键控制拍照推理或者是实时推理并显示。本文仅实现图像数据采集,这篇文章有给出按键和lcd的代码。
本系列第一篇:本文
本系列第二篇:
本系列第三篇:
使用的开发板是实验室的板子,就是正点原子的rv1126核心板,配上其他公司开发的底板。

交叉编译是一种将软件在操作系统上进行编译,但在另一种不同的操作系统或架构上运行的技术。本文将使用ubuntu20.04作为主机操作系统,并将opencv编译为在另一个目标平台上运行的库。
经过测试,rv1126开发板上的opencv似乎安装的不够完整,没法使用高级的opencv类,导致想调用videocapture 函数读取摄像头数据进行模型推理失败(ps:嫌交叉编译opencv麻烦的,也可以使用linux操作系统中用于支持视频设备的框架:v4l2。参考本系列的第二篇博客)。但是v4l2真正使用起来肯定还是没有直接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.xz
 tar -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文件,在当前目录下。

参考:https://www.cnblogs.com/tangjunjun/p/16527020.html

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com