ArmSom------摄像头开发指南(二)

2023-11-03 16:52

本文主要是介绍ArmSom------摄像头开发指南(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. 简介

  • RK3588从入门到精通

  • 开发板:ArmSoM-W3

  • Kernel:5.10.160

  • OS:Debian11

    上篇文档介绍了rockchip平台怎么配置MIPI-CSI的通路,本⽂主要介绍在Rockchip平台下Camera相关测试命令

二. 摄像头连接

ArmSoM-W3开发板与imx415连接图如下:
在这里插入图片描述

注意

排线的金属引脚朝向板子

三. 使用摄像头

连接摄像头模块并上电后,可查看开机日志。

root@linaro-alip:/# dmesg | grep imx415
[    2.547754] imx415 3-001a: driver version: 00.01.08
[    2.547767] imx415 3-001a:  Get hdr mode failed! no hdr default
[    2.547819] imx415 3-001a: Failed to get power-gpios
[    2.547826] imx415 3-001a: could not get default pinstate
[    2.547831] imx415 3-001a: could not get sleep pinstate
[    2.547850] imx415 3-001a: supply dvdd not found, using dummy regulator
[    2.547918] imx415 3-001a: supply dovdd not found, using dummy regulator
[    2.547945] imx415 3-001a: supply avdd not found, using dummy regulator
[    2.613843] imx415 3-001a: Detected imx415 id 0000e0
[    2.613890] rockchip-csi2-dphy csi2-dphy0: dphy0 matches m00_b_imx415 3-001a:bus type 5
[   18.386174] imx415 3-001a: set fmt: cur_mode: 3864x2192, hdr: 0
[   18.389067] imx415 3-001a: set exposure(shr0) 2047 = cur_vts(2250) - val(203)

如果没有报错,那表明模块在正常运行,在Linux系统中,你可以使用多种方法来访问和利用该摄像头设备。

3.1 使用命令行工具

media-ctl 和 v4l2-ctl 是在Linux环境下用于配置和管理视频和多媒体设备的命令行工具。它们通常与V4L2(Video for Linux 2)子系统一起使用,用于管理摄像头、视频采集卡、显示设备和其他多媒体硬件的设置和参数。

media-ctl工具的操作是通过/dev/medio0等media 设备,它管理的是Media的拓扑结构中各个节点的
format、大小、 链接。
v4l2-ctl工具则是针对/dev/video0,/dev/video1等 video设备,它在video设备上进行set_fmt、
reqbuf、qbuf、dqbuf、stream_on、stream_off 等一系列操作。

 n为4的倍数(0,1,2,3…)/dev/videon+0:视频输出 SP主通道/dev/videon+1:视频输出 MP自身通道/dev/videon+2:3A统计/dev/videon+3:3A参数设置

3.1.1 显示拓扑结构

使用以下命令可以显示拓扑结构:

media-ctl -p -d /dev/media0

主要关注的是有没有找到Sensor的Entity。如果没有找到Sensor的Entity,说明Sensor注册有问题。

开发板上接上摄像头后可以看到如下的输出:

root@linaro-alip:# media-ctl -p -d /dev/media0............
- entity 58: rockchip-csi2-dphy0 (2 pads, 2 links)type V4L2 subdev subtype Unknown flags 0device node name /dev/v4l-subdev1pad0: Sink[fmt:SGBRG10_1X10/3864x2192@10000/300000 field:nonecrop.bounds:(12,16)/3840x2160]<- "m00_b_imx415 3-001a":0 [ENABLED]pad1: Source-> "rockchip-mipi-csi2":0 [ENABLED]- entity 63: m00_b_imx415 3-001a (1 pad, 1 link)type V4L2 subdev subtype Sensor flags 0device node name /dev/v4l-subdev2pad0: Source[fmt:SGBRG10_1X10/3864x2192@10000/300000 field:nonecrop.bounds:(12,16)/3840x2160]-> "rockchip-csi2-dphy0":0 [ENABLED]

3.2.2 查看摄像头信息

使用命令列出所有摄像头设备:

root@linaro-alip:/home/linaro# v4l2-ctl --list-devices
rk_hdmirx (fdee0000.hdmirx-controller):/dev/video20rkisp-statistics (platform: rkisp):/dev/video18/dev/video19rkcif-mipi-lvds2 (platform:rkcif):/dev/media0rkcif (platform:rkcif-mipi-lvds2):/dev/video0/dev/video1/dev/video2/dev/video3/dev/video4/dev/video5/dev/video6/dev/video7/dev/video8/dev/video9/dev/video10rkisp_mainpath (platform:rkisp0-vir0):/dev/video11/dev/video12/dev/video13/dev/video14/dev/video15/dev/video16/dev/video17/dev/media1

其中/dev/video11就是这个摄像头的设备。

查看设备的预览支持格式:

root@linaro-alip:/# v4l2-ctl --list-formats-ext --device /dev/video11
ioctl: VIDIOC_ENUM_FMTType: Video Capture Multiplanar[0]: 'UYVY' (UYVY 4:2:2)Size: Stepwise 32x16 - 3840x2160 with step 8/8[1]: 'NV16' (Y/CbCr 4:2:2)Size: Stepwise 32x16 - 3840x2160 with step 8/8[2]: 'NV61' (Y/CrCb 4:2:2)Size: Stepwise 32x16 - 3840x2160 with step 8/8[3]: 'NV21' (Y/CrCb 4:2:0)Size: Stepwise 32x16 - 3840x2160 with step 8/8[4]: 'NV12' (Y/CbCr 4:2:0)Size: Stepwise 32x16 - 3840x2160 with step 8/8[5]: 'NM21' (Y/CrCb 4:2:0 (N-C))Size: Stepwise 32x16 - 3840x2160 with step 8/8[6]: 'NM12' (Y/CbCr 4:2:0 (N-C))Size: Stepwise 32x16 - 3840x2160 with step 8/8

查看设备的所有信息:

root@linaro-alip:/home/linaro# v4l2-ctl --all --device /dev/video11
Driver Info:Driver name      : rkisp_v6Card type        : rkisp_mainpathBus info         : platform:rkisp0-vir0Driver version   : 2.0.0Capabilities     : 0x84201000Video Capture MultiplanarStreamingExtended Pix FormatDevice CapabilitiesDevice Caps      : 0x04201000Video Capture MultiplanarStreamingExtended Pix Format
Media Driver Info:Driver name      : rkisp0-vir0Model            : rkisp0Serial           : Bus info         : Media version    : 5.10.110Hardware revision: 0x00000000 (0)Driver version   : 5.10.110
Interface Info:ID               : 0x03000007Type             : V4L Video
Entity Info:ID               : 0x00000006 (6)Name             : rkisp_mainpathFunction         : V4L2 I/OPad 0x01000009   : 0: SinkLink 0x0200000a: from remote pad 0x1000004 of entity 'rkisp-isp-subdev': Data, Enabled
Priority: 2
Format Video Capture Multiplanar:Width/Height      : 3840/2160Pixel Format      : 'NV12' (Y/CbCr 4:2:0)Field             : NoneNumber of planes  : 1Flags             : Colorspace        : DefaultTransfer Function : DefaultYCbCr/HSV Encoding: DefaultQuantization      : Full RangePlane 0           :Bytes per Line : 3840Size Image     : 12441600
Selection Video Capture: crop, Left 0, Top 0, Width 3840, Height 2160, Flags: 
Selection Video Capture: crop_bounds, Left 0, Top 0, Width 3840, Height 2160, Flags: 
Selection Video Output: crop, Left 0, Top 0, Width 3840, Height 2160, Flags: 
Selection Video Output: crop_bounds, Left 0, Top 0, Width 3840, Height 2160, Flags: Image Processing Controlspixel_rate 0x009f0902 (int64)  : min=0 max=1000000000 step=1 default=1000000000 value=356800000 flags=read-only, volatile

3.2.3 显示图像

使用v4l2-ctl抓一帧图片:

root@linaro-alip:/# v4l2-ctl --verbose -d /dev/video11 --set-fmt-video=width=3840,height=2160,pixelformat='NV12' --stream-mmap=4 --stream-skip=3 --stream-to=/data/4k_nv12.yuv --stream-count=4 --stream-poll
VIDIOC_QUERYCAP: ok
VIDIOC_G_FMT: ok
VIDIOC_S_FMT: ok
Format Video Capture Multiplanar:Width/Height      : 3840/2160Pixel Format      : 'NV12' (Y/CbCr 4:2:0)Field             : NoneNumber of planes  : 1Flags             :Colorspace        : DefaultTransfer Function : DefaultYCbCr/HSV Encoding: DefaultQuantization      : Full RangePlane 0           :Bytes per Line : 3840Size Image     : 12441600VIDIOC_REQBUFS returned 0 (Success)VIDIOC_QUERYBUF returned 0 (Success)VIDIOC_QUERYBUF returned 0 (Success)VIDIOC_QUERYBUF returned 0 (Success)VIDIOC_QUERYBUF returned 0 (Success)VIDIOC_QBUF returned 0 (Success)VIDIOC_QBUF returned 0 (Success)VIDIOC_QBUF returned 0 (Success)VIDIOC_QBUF returned 0 (Success)VIDIOC_STREAMON returned 0 (Success)
cap dqbuf: 0 seq:      0 bytesused: 12441600 ts: 4953.039121 delta: 4953039.121 ms (ts-monotonic, ts-src-eof)
cap dqbuf: 1 seq:      1 bytesused: 12441600 ts: 4953.073968 (ts-monotonic, ts-src-eof)
cap dqbuf: 2 seq:      2 bytesused: 12441600 ts: 4953.106558 (ts-monotonic, ts-src-eof)
cap dqbuf: 3 seq:      3 bytesused: 12441600 ts: 4953.139114 (ts-monotonic, ts-src-eof)
cap dqbuf: 0 seq:      4 bytesused: 12441600 ts: 4953.173258 fps: 29.82 (ts-monotonic, ts-src-eof)
cap dqbuf: 1 seq:      5 bytesused: 12441600 ts: 4953.206177 fps: 29.93 (ts-monotonic, ts-src-eof)
cap dqbuf: 2 seq:      6 bytesused: 12441600 ts: 4953.239030 fps: 30.01 (ts-monotonic, ts-src-eof)

参数说明:

-d: 摄像头对应设备文件
–set-fmt-video:指定了宽高及pxielformat(用FourCC表示)。NV12即用FourCC表示的pixelformat
–stream-mmap:指定buffer的类型为mmap,即由kernel分配的物理连续的或经过iommu映射的buffer
–stream-to:指定帧数据保存的文件路径
–stream-skip:指定丢弃(不保存到文件)前3帧
–stream-count:指定抓取的帧数,不包括–stream-skip丢弃的数量

抓取的图片使用adb工具拷贝到Windows下用7YUV工具打开,也可以用ffplay命令打开

ffplay是FFmpeg提供的一个极为简单的音视频媒体播放器(由ffmpeg库和SDL库开发),可以用于音视频播放、可视化分析 ,提供音视频显示和播放相关的图像信息、音频的波形等信息,也可以用作FFmpeg API的测试工具使用。

使用 ffplay 非常简单,只需在终端中运行以下命令来播放媒体文件:

ffplay /data/4k_nv12.yuv -f rawvideo -pixel_format nv12 -video_size 3840x2160

3.2.3 显示视频

使用v4l2可以录制视频:

v4l2-ctl --verbose -d /dev/video11 --set-fmt-video=width=3840,height=2160,pixelformat='NV12' --stream-mmap=4 --set-selection=target=crop,flags=0,top=0,left=0,width=3840,height=2160 --stream-to=out.yuv

使用ffplay播放:

ffplay -f rawvideo -video_size 3840x2160 -pixel_format nv12 out.yuv

3.3 使用多媒体框架应用程序

GStreamer:GStreamer是一种多媒体框架,你可以使用它来构建自定义的多媒体应用程序,捕获摄像头视频,进行处理和展示。

你可以使用以下GStreamer管道捕获视频:

gst-launch-1.0 v4l2src device=/dev/video11 ! video/x-raw,format=NV12,width=3840,height=2160,framerate=30/1 ! videoconvert ! autovideosink
  • v4l2src:从 /dev/video11 捕获视频数据。
  • video/x-raw:指定输出数据格式为原始视频,format 参数设置为 NV12,width 设置为 3840,height 设置为 2160,framerate 设置为 30fps。
  • videoconvert:执行格式转换,确保输出数据适用于后续的元素。
  • autovideosink:自动选择适当的视频输出插件,将视频显示在屏幕上。

显示如下:

在这里插入图片描述

注意:显示器的分辨率是1920x1080,摄像头的分辨率是3840x2160,导致如左上角画面显示不全,双击边框可以得到分辨率是1920x1080的画面。

下面有一个简单的Python示例,用于创建一个GStreamer管道并启动捕获视频可供参考:

import gi
gi.require_version('Gst', '1.0')
from gi.repository import GstGst.init(None)# 创建一个新的GStreamer管道
pipeline = Gst.Pipeline()# 创建元素,设置摄像头设备和分辨率
src = Gst.ElementFactory.make("v4l2src", "v4l2-source")
src.set_property("device", "/dev/video11")caps = Gst.Caps.from_string("video/x-raw,format=NV12,width=3840,height=2160,framerate=30/1")
filter = Gst.ElementFactory.make("capsfilter", "filter")
filter.set_property("caps", caps)convert = Gst.ElementFactory.make("videoconvert", "converter")
sink = Gst.ElementFactory.make("autovideosink", "videosink")# 将元素添加到管道中
pipeline.add(src)
pipeline.add(filter)
pipeline.add(convert)
pipeline.add(sink)# 链接元素
src.link(filter)
filter.link(convert)
convert.link(sink)# 设置管道的状态为播放
pipeline.set_state(Gst.State.PLAYING)try:# 在此处添加自定义的处理逻辑# 你可以添加信号处理、保存视频到文件、处理图像等操作pass
except KeyboardInterrupt:pass# 停止管道并释放资源
pipeline.set_state(Gst.State.NULL)

3.4.自定义应用程序开发

特定的定制功能,一般是使用编程语言(如C++或Python)开发自己的摄像头应用程序

总的来说,应用程序通过API接口采集视频数据大致分为五个步骤:

首先,打开视频设备文件,进行视频采集的参数初始化,设置视频图像的采集窗口、采集的点阵大小和格式;

其次,申请若干视频采集的帧缓冲区,并将这些帧缓冲区从内核空间映射到用户空间,便于应用程序读取/处理视频数据;

第三,将申请到的帧缓冲区在视频采集输入队列排队,并启动视频采集;

第四,驱动开始视频数据的采集,应用程序从视频采集输出队列取出帧缓冲区,处理完后,将帧缓冲区重新放入视频采集输入队列,循环往复采集连续的视频数据;

第五,停止视频采集。

四. 结语

根据需求,选择最适合的方法来访问和使用摄像头设备,每个具体型号的摄像头可能有其独特的设置和要求,各个系统下的使用摄像头的方法也有很多,如果你有疑问或者需要帮助,可以在ArmSom论坛提出问题,与其他开发者分享经验和获取支持。

这篇关于ArmSom------摄像头开发指南(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/339586

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧