Difference between revisions of "MV Camera Application Development Guide on Rochchip/zh"

From wiki_veye
Jump to navigation Jump to search
Line 172: Line 172:
 
应用程序可以通过/dev/video0节点获取图像。
 
应用程序可以通过/dev/video0节点获取图像。
  
===== mv camera entity信息 =====
+
=====mv camera entity信息=====
 
以MV-MIPI-IMX296M为例:
 
以MV-MIPI-IMX296M为例:
  
Line 189: Line 189:
 
可以看到:
 
可以看到:
  
* 该Entity完整的名称是: <code>m00_b_mvcam 7-003b</code>。(在ROC-RK3566-PC上该Entity名称是<code>m00_b_mvcam 4-003b</code>)
+
*该Entity完整的名称是: <code>m00_b_mvcam 7-003b</code>。(在ROC-RK3566-PC上该Entity名称是<code>m00_b_mvcam 4-003b</code>)
* 它是一个 V4L2 subdev (Sub-Device) Sensor。
+
*它是一个 V4L2 subdev (Sub-Device) Sensor。
* 它对应的节点是 <code>/dev/v4l-subdev2</code> ,应用程序(如<code>v4l2-ctl</code>)可以打开它,并进行配置。
+
*它对应的节点是 <code>/dev/v4l-subdev2</code> ,应用程序(如<code>v4l2-ctl</code>)可以打开它,并进行配置。
* 它的输出格式是 [<code>fmt:Y8_1X8/1456x1088@100/6000 field:none</code>] ,其中<code>Y8_1X8</code>是一种mbus-code的简写,下一小节会列出支持的mbus-code。
+
*它的输出格式是 [<code>fmt:Y8_1X8/1456x1088@100/6000 field:none</code>] ,其中<code>Y8_1X8</code>是一种mbus-code的简写,下一小节会列出支持的mbus-code。
* 当前分辨率是<code>1456x1088。</code>
+
*当前分辨率是<code>1456x1088。</code>
* 当前帧间隔是<code>100/6000</code>,即帧率是60。
+
*当前帧间隔是<code>100/6000</code>,即帧率是60。
  
 
摄像机输出的数据格式,可以通过media-ctl指令修改。
 
摄像机输出的数据格式,可以通过media-ctl指令修改。
  
==== 相机支持的mbus-code ====
+
====相机支持的mbus-code====
 
MV系列和RAW系列相机具备不同的数据格式能力,具体请参考每个型号的相机的数据手册。
 
MV系列和RAW系列相机具备不同的数据格式能力,具体请参考每个型号的相机的数据手册。
 
{| class="wikitable"
 
{| class="wikitable"
Line 223: Line 223:
 
|}
 
|}
  
=== raw图片格式说明 ===
+
===raw图片格式说明===
 
RK3588的VICAP模块支持两种数据保存格式,Compact和Noncompact RAW。可以通过RKCIF的RKCIF_CMD_SET_CSI_MEMORY_MODE ioctl指令修改模式。默认情况下,输出的是Compact RAW格式。
 
RK3588的VICAP模块支持两种数据保存格式,Compact和Noncompact RAW。可以通过RKCIF的RKCIF_CMD_SET_CSI_MEMORY_MODE ioctl指令修改模式。默认情况下,输出的是Compact RAW格式。
 
[[File:Compact raw and noncompact raw of rk3588 vicap.png|center|thumb|800x800px|Compact raw and noncompact raw of rk3588 VICAP]]
 
[[File:Compact raw and noncompact raw of rk3588 vicap.png|center|thumb|800x800px|Compact raw and noncompact raw of rk3588 VICAP]]
  
  
 +
==== 具有填充位的图片格式(Noncompact RAW) ====
 +
对于10bit深度、12bit深度的像素数据,总是使用两个字节来存储一个像素。这种存储方式方便软件处理,缺点是空间占用较大。根据数据有效数据保存在高位还是低位,又分为high align和low align两种。
 +
 +
===== Noncompact RAW(high align) =====
 +
数据保存到高位,用不到的低位以0填充。RK VICAP支持的一种数据格式。
 +
 +
===== Noncompact RAW(low align) =====
 +
数据保存到低位,用不到的高位以0填充。V4L2标准的'Y10 ' (10-bit Greyscale),'Y12 ' (12-bit Greyscale)格式都是以这种方式存储的。
 +
 +
后文提到的pixel_layer_convert转换工具,也是将Compact RAW转换为此种存储方式。方便使用图片播放器打开显示。
 +
 +
==== 紧密排列的图片格式(Compact RAW) ====
 +
如上图所示,像素和像素之间不会进行空bit位填充。
 +
 +
==== 行对齐(line stride) ====
 +
为了方便对图像进行快速操作,系统通常为每行数据提供行对齐的buffer大小。RK3588使用256字节对齐。
 +
 +
line_stride = ALIGN_UP(image_width*bits_per_pixel/8,256)
 +
 +
比如当图像宽度是1456时:
 +
 +
8bit depth,line_stride=1536。
 +
 +
10bit depth,preferred_stride=2048。
 +
 +
12bit depth,preferred_stride=2304。
  
  
  
 
<br />
 
<br />

Revision as of 10:18, 25 December 2025

English

MV系列摄像头模组在Rockchip平台的应用层使用和开发指南

1 概述

本文档适用于驱动已正确安装、硬件连接无误,且相机已经正确识别的场景。

本文主要达成一下目的:

  • 查询已接入的 MV 系列摄像头的设备信息;
  • 完成摄像头工作模式的设置和准备;
  • 介绍几种预览、抓图的方法;
  • 介绍参数配置方法;
  • 对客户二次开发进行指引。

对于rockchip平台,无论使用哪种方法调用相机,均需完成设备探测和media-ctl配置格式的步骤,才可以进行后续操作。所以下面首先介绍设备探测和media-ctl配置。

注意,veye_viewer客户端已经内置了设备探测和media-ctl配置功能。因此,在完成驱动安装和硬件连接确认之后,可以直接参考后文所述veye_viewer客户端章节预览相机图像。


2 系统状态检测

2.1 是否正确识别到了相机

完成系统安装后,系统上电。在Firefly板端执行以下命令来检测是否正确连接相机。

dmesg | grep mvcam

应当有类似下面的提示:

mvcam 7-003b: camera is:MV-MIPI-IMX296M

mvcam 7-003b: firmware version: 0x1290133

可以看到识别到当前的摄像机模组的型号,版本号。

在ROC-RK3588S-PC上,摄像机挂载在i2c-7, i2c地址是0x3b。

在ROC-RK3566-PC和ROC-RK3576-PC上,摄像机挂载在i2c-4。

  • 执行如下命令检查video0设备节点

ls /dev/video0

可以看到

video0

正确识别摄像头之后,相机被识别为/dev/video0。

3 设备检测并配置环境变量

这里,我们提供了两个脚本,可以自动检索相机的一些信息。

3.1 probe_camera_info-rk.sh

该脚本用于探测已连接并成功注册的摄像头设备,检索设备对应的媒体设备节点、视频设备节点、子设备节点、I²C 总线及设备名称等底层信息。

执行后,将在当前目录生成 auto_camera_index.json 文件并在文件中记录检索到的信息。

下面是一个例子:

$ ./probe_camera_info-rk.sh

cat auto_camera_index.json

[

  {

    "media_node": "/dev/media0",

    "video_node": "/dev/video0",

    "video_subnode": "/dev/v4l-subdev2",

    "media_entity_name": "m00_b_mvcam 7-003b",

    "i2c_bus": "7"

  }

]

{}内是一个摄像头的信息,如果主板支持多个摄像头模组,则会出现多组{}包含的内容。

摄像头信息解释如下:

摄像头信息
代称 名称 作用 何处使用
media_node 媒体设备节点 (Media device node) 用于访问 media-controller 框架中的设备 由media-ctl命令配置分辨率和格式时使用
video_node 视频设备节点(Video capture device node) 典型 V4L2 视频设备 v4l2-ctl或者客户开发的程序,获取图像时使用
video_subnode 视频子设备节点(V4L2 sub-device node) 配置摄像头的部分参数时使用 v4l2-ctl命令使用
media_entity_name 设备名称(Media entity name) 描述设备的名称,例如 "m00_b_gxcam 7-003b" 由media-ctl命令配置分辨率和格式时使用
i2c_bus I²C 总线号 表示设备连接的 I²C 总线编号 对摄像头进行参数配置的底层通信信道,gx_mipi_i2c.sh脚本使用

后文中使用的媒体设备节点、视频设备节点、子设备节点、I²C 总线及设备名称,均可参考此探测脚本得到的json文件中的信息进行替换。

3.2 mv_probe.sh

使用mv_probe.sh脚本,可以将某一个相机对应的I²C总线编号、相机型号、宽、高、帧率等信息配置到环境变量中。

如此,则方便后续使用media-ctl配置格式使用起来更方便。

使用方法是:

source ./mv_probe.sh一个典型的输出如下:

$ source ./mv_probe.sh

The mvcam driver is loaded on i2c-10, but the camera is not detected!

Found veye_mvcam camera on i2c-11.

Setenv CAMERAMODEL = RAW-MIPI-SC535M

Setenv FPS = 49

Setenv WIDTH = 2432

Setenv HEIGHT = 2048

可以通过 echo $CAMERAMODEL来验证环境变量的输出结果。注意,此环境变量只对当前会话有效。注意:此脚本需要mvcam的驱动版本大于等于1.1.06才可以支持。

如你使用的驱动版本小于1.1.06,或者你希望使用不同于当前值的宽、高、帧率。请参考相机模组的手册,手动配置如下WIDTH HEIGHT FPS环境变量,否则可能导致后面的程序运行不正常。如:

export WIDTH=2432

export HEIGHT=2048

export FPS=50

3.3 配置命令行全局变量

根据主板型号,配置I2C_BUS全局变量。

  • ROC-RK3588S-PC

export I2C_BUS=7

  • ROC-RK3566-PC and ROC-RK3576-PC

export I2C_BUS=4

3.4 使用media-ctl查看拓扑结构

使用media-ctl指令,可以清晰的展现出当前的拓扑结构。

media-ctl -p -d /dev/media0

3.4.1 链接关系

mv camera->rockchip-csi2-dphy0->rockchip-mipi-csi2->stream_cif_mipi_id0 - - ->DDR(/dev/video0)

应用程序可以通过/dev/video0节点获取图像。

3.4.2 mv camera entity信息

以MV-MIPI-IMX296M为例:

- entity 63: m00_b_mvcam 7-003b (1 pad, 1 link)

             type V4L2 subdev subtype Sensor flags 0

             device node name /dev/v4l-subdev2

        pad0: Source

                [fmt:Y8_1X8/1456x1088@100/6000 field:none]

                -> "rockchip-csi2-dphy0":0 [ENABLED]

可以看到:

  • 该Entity完整的名称是: m00_b_mvcam 7-003b。(在ROC-RK3566-PC上该Entity名称是m00_b_mvcam 4-003b
  • 它是一个 V4L2 subdev (Sub-Device) Sensor。
  • 它对应的节点是 /dev/v4l-subdev2 ,应用程序(如v4l2-ctl)可以打开它,并进行配置。
  • 它的输出格式是 [fmt:Y8_1X8/1456x1088@100/6000 field:none] ,其中Y8_1X8是一种mbus-code的简写,下一小节会列出支持的mbus-code。
  • 当前分辨率是1456x1088。
  • 当前帧间隔是100/6000,即帧率是60。

摄像机输出的数据格式,可以通过media-ctl指令修改。

3.5 相机支持的mbus-code

MV系列和RAW系列相机具备不同的数据格式能力,具体请参考每个型号的相机的数据手册。

格式对应关系
Format on datasheet mbus-code for media-ctl FourCC pixelformat for v4l2-ctl
RAW8 Y8_1X8 GREY
RAW10 Y10_1X10 'Y10 '
RAW12 Y12_1X12 'Y12 '
UYVY UYVY8_2X8 UYVY

4 raw图片格式说明

RK3588的VICAP模块支持两种数据保存格式,Compact和Noncompact RAW。可以通过RKCIF的RKCIF_CMD_SET_CSI_MEMORY_MODE ioctl指令修改模式。默认情况下,输出的是Compact RAW格式。

Compact raw and noncompact raw of rk3588 VICAP


4.1 具有填充位的图片格式(Noncompact RAW)

对于10bit深度、12bit深度的像素数据,总是使用两个字节来存储一个像素。这种存储方式方便软件处理,缺点是空间占用较大。根据数据有效数据保存在高位还是低位,又分为high align和low align两种。

4.1.1 Noncompact RAW(high align)

数据保存到高位,用不到的低位以0填充。RK VICAP支持的一种数据格式。

4.1.2 Noncompact RAW(low align)

数据保存到低位,用不到的高位以0填充。V4L2标准的'Y10 ' (10-bit Greyscale),'Y12 ' (12-bit Greyscale)格式都是以这种方式存储的。

后文提到的pixel_layer_convert转换工具,也是将Compact RAW转换为此种存储方式。方便使用图片播放器打开显示。

4.2 紧密排列的图片格式(Compact RAW)

如上图所示,像素和像素之间不会进行空bit位填充。

4.3 行对齐(line stride)

为了方便对图像进行快速操作,系统通常为每行数据提供行对齐的buffer大小。RK3588使用256字节对齐。

line_stride = ALIGN_UP(image_width*bits_per_pixel/8,256)

比如当图像宽度是1456时:

8bit depth,line_stride=1536。

10bit depth,preferred_stride=2048。

12bit depth,preferred_stride=2304。