Changes

Jump to navigation Jump to search
Line 14: Line 14:  
|MV系列
 
|MV系列
 
|MV-MIPI-IMX178M
 
|MV-MIPI-IMX178M
 +
|完成
 +
|-
 +
|MV系列
 +
|MV-MIPI-SC130M
 +
|完成
 +
|-
 +
|MV系列
 +
|MV-MIPI-IMX287M
 +
|完成
 +
|-
 +
|MV系列
 +
|MV-MIPI-IMX296M
 +
|完成
 +
|-
 +
|MV系列
 +
|MV-MIPI-IMX265M
 +
|完成
 +
|-
 +
|MV系列
 +
|MV-MIPI-IMX264M
 +
|完成
 +
|-
 +
|RAW系列
 +
|RAW-MIPI-SC132M
 +
|完成
 +
|-
 +
|RAW系列
 +
|RAW-MIPI-IMX462M
 +
|完成
 +
|-
 +
|RAW系列
 +
|RAW-MIPI-AR0234M
 
|完成
 
|完成
 
|}
 
|}
 
=== 硬件准备及安装 ===
 
=== 硬件准备及安装 ===
MV系列相机需要使用ADP-MV1转接板才能连接到树莓派。下面以MV-MIPI-IMX178M为例,介绍硬件的安装方法。
     −
==== MV-MIPI-IMX178M与ADP-MV1的连接 ====
+
==== MV系列摄像头使用ADP-MV1的连接方式 ====
 +
MV系列相机需要使用ADP-MV1转接板才能连接到树莓派。
 +
 
 +
===== MV系列摄像头与ADP-MV1的连接 =====
 
二者使用0.5mm间距*30P的FFC异面线连接,注意接触面向外。
 
二者使用0.5mm间距*30P的FFC异面线连接,注意接触面向外。
[[File:ADP-MV1-MV-MIPI-X 01.jpg|center|thumb|800x800px|ADP-MV1 to MV-MIPI-X]]
+
{| class="wikitable"
<br />
+
!TOP
 
+
!BOTTOM
==== ADP-MV1与树莓派的连接 ====
+
|-
 
+
|[[File:ADP-MV1-MV-MIPI-X 01.jpg|center|thumb|600x600px|ADP-MV1 to MV-MIPI-X|alt=]]
 +
|[[File:ADP-MV1-MV-MIPI-X 02.jpg|alt=|center|thumb|600x600px|ADP-MV1 to MV-MIPI-X]]
 +
|}
 
===== 供电 =====
 
===== 供电 =====
 
ADP-MV1需要独立的5V供电,可以使用杜邦线直接从树莓派主板取电。
 
ADP-MV1需要独立的5V供电,可以使用杜邦线直接从树莓派主板取电。
 
[[File:ADP-MV1-MV-MIPI-X 07.jpg|center|thumb|800x800px|ADP-MV1 power supply]]
 
[[File:ADP-MV1-MV-MIPI-X 07.jpg|center|thumb|800x800px|ADP-MV1 power supply]]
 
<br />
 
<br />
 
+
===== 树莓派5 =====
 +
二者使用15P转22P的FFC同面线连接,注意接触面安装方向。
 +
{| class="wikitable"
 +
!TOP
 +
!BOTTOM
 +
|-
 +
|[[File:ADP-MV1 to RPI5.jpg|center|thumb|600x600px|ADP-MV1 to RPI5]]
 +
|[[File:ADP-MV1 to RPI5 2.jpg|alt=|center|thumb|600x600px|ADP-MV1 to RPI5_2]]
 +
|}<br />
 
===== 树莓派Model B和Model B+ =====
 
===== 树莓派Model B和Model B+ =====
 
二者使用1mm间距*15P的FFC异面线连接,注意接触面安装方向。
 
二者使用1mm间距*15P的FFC异面线连接,注意接触面安装方向。
Line 38: Line 82:  
===== 树莓派Zero,Zero W和Computer Module =====
 
===== 树莓派Zero,Zero W和Computer Module =====
 
二者使用15P转22P的FFC同面线连接,注意接触面安装方向。
 
二者使用15P转22P的FFC同面线连接,注意接触面安装方向。
[[File:MV-MIPI-X-RPI Z 01.jpg|center|thumb|800x800px|MV camera and Raspberry Pi zero connection]]
+
[[File:MV-MIPI-X-RPI Z 01.jpg|center|thumb|800x800px|MV camera and Raspberry Pi zero connection]]<br />[[File:MV-MIPI-X-RPI IOB 03.jpg|center|thumb|800x800px|MV camera and Raspberry Pi CM4]]
[[File:MV-MIPI-X-RPI IOB 03.jpg|center|thumb|800x800px|MV camera and Raspberry Pi CM4]]
+
<br />
 +
 
 +
==== RAW系列摄像头连接到树莓派 ====
 +
 
 +
===== 树莓派5 =====
 +
RAW-MIPI-SC132M使用15to22pin同面FFC线,其他RAW系列相机使用22pin异面FFC线。
 +
[[File:RAW CAM to RPI5.jpg|center|thumb|800x800px|RAW CAM to RPI5]]
 
<br />
 
<br />
 +
 +
===== 树莓派Model B和Model B+ =====
 +
RAW-MIPI-SC132M使用15pin异面FFC线,其他RAW系列相机使用15to22pin同面FFC线。
 +
[[File:RAW-MIPI-AR0234-RPI4.jpg|center|thumb|800x800px|RAW series camera and RPI connection]]
 +
 +
===== 树莓派Zero,Zero W和Computer Module =====
 +
RAW-MIPI-SC132M使用15to22pin同面FFC线,其他RAW系列相机使用22pin异面FFC线。
 +
[[File:RAW-MIPI-AR0234-RPI ZERO.jpg|center|thumb|800x800px|RAW-MIPI-AR0234-RPI ZERO]]
    
=== piOS的配置 ===
 
=== piOS的配置 ===
Line 52: Line 110:     
建议启用树莓派系统的ssh服务及samba服务,这里不再赘述树莓派系统如何开启ssh和samba服务。
 
建议启用树莓派系统的ssh服务及samba服务,这里不再赘述树莓派系统如何开启ssh和samba服务。
=== Legacy模式和V4L2模式介绍 ===
+
=== V4L2模式和Legacy模式介绍 ===
这两个模式的区别,树莓派官网有详细的[https://www.raspberrypi.com/documentation/accessories/camera.html#libcamera-and-the-legacy-raspicam-camera-stack 介绍]。树莓派网站上提到的libcamera-stack模式与我们所说的V4L2模式架构上一致。
+
在最新的树莓派bookworm系统中,已经去掉了对Legacy模式的支持。建议客户使用V4L2模式。
 +
 
 +
==== libcamera以及V4L2模式 ====
 +
现在piOS已全面切换为libcamera-stack模式。
 +
 
 +
libcamera-stack本质上以实现isp功能为核心,这点是MV系列相机不需要的。因此,我们采用了'''V4L2模式''',而不是使用libcamera-stack。
 +
 
 +
与libcamera-stack相同,我们的'''V4L2模式''',也实现了linux驱动层标准的V4L2驱动。基于此驱动,应用层可以直接开发程序获取图像并进行进一步处理。
    
==== Legacy模式 ====
 
==== Legacy模式 ====
Line 71: Line 136:  
由于两种工作模式不能共存,因此使用V4L2模式时需要关闭Legacy模式。
 
由于两种工作模式不能共存,因此使用V4L2模式时需要关闭Legacy模式。
   −
==== libcamera以及V4L2模式 ====
+
=== 配置命令行全局变量 ===
现在piOS已全面切换为libcamera-stack模式。
+
为了后面描述方便,此处根据sensor尺寸,配置全局变量。
 +
 
 +
*MV-MIPI-IMX178M
 +
 
 +
<code>export WIDTH=3088</code>
 +
 
 +
<code>export HEIGHT=2064</code>
 +
 
 +
<code>export FPS=22</code>
 +
 
 +
*MV-MIPI-SC130M
 +
 
 +
<code>export WIDTH=1280</code>
 +
 
 +
<code>export HEIGHT=1024</code>
 +
 
 +
<code>export FPS=108</code>
 +
 
 +
* MV-MIPI-IMX296M
 +
 
 +
<code>export WIDTH=1440</code>
 +
 
 +
<code>export HEIGHT=1088</code>
 +
 
 +
<code>export FPS=60</code>
 +
 
 +
*MV-MIPI-IMX287M
 +
 
 +
<code>export WIDTH=704</code>
 +
 
 +
<code>export HEIGHT=544</code>
 +
 
 +
<code>export FPS=319</code>
 +
 
 +
*MV-MIPI-IMX265M
 +
 
 +
<code>export WIDTH=2048</code>
 +
 
 +
<code>export HEIGHT=1544</code>
 +
 
 +
<code>export FPS=45</code>
 +
 
 +
*MV-MIPI-IMX264M
 +
 
 +
<code>export WIDTH=2432</code>
 +
 
 +
<code>export HEIGHT=2056</code>
 +
 
 +
<code>export FPS=28</code>
 +
 
 +
*RAW-MIPI-SC132M
 +
 
 +
<code>export WIDTH=1024</code>
 +
 
 +
<code>export HEIGHT=1280</code>
 +
 
 +
<code>export FPS=120</code>
 +
 
 +
*RAW-MIPI-IMX462M
 +
 
 +
<code>export WIDTH=1920</code>
 +
 
 +
<code>export HEIGHT=1088</code>
 +
 
 +
<code>export FPS=60</code>
 +
 
 +
*RAW-MIPI-AR0234M
   −
libcamera-stack本质上以实现isp功能为核心,这点是MV系列相机不需要的。因此,我们采用了'''V4L2模式''',而不是使用libcamera-stack。
+
<code>export WIDTH=1920</code>
   −
与libcamera-stack相同,我们的'''V4L2模式''',也实现了linux驱动层标准的V4L2驱动。基于此驱动,应用层可以直接开发程序获取图像并进行进一步处理。
+
<code>export HEIGHT=1200</code>
    +
<code>export FPS=60</code>
 
=== V4L2模式用法 ===
 
=== V4L2模式用法 ===
 
我们在这个[https://github.com/veyeimaging/raspberrypi_v4l2 github仓库]保存了v4l2模式的代码。
 
我们在这个[https://github.com/veyeimaging/raspberrypi_v4l2 github仓库]保存了v4l2模式的代码。
Line 89: Line 221:     
<code>chmod +x *</code>
 
<code>chmod +x *</code>
 +
 +
* 对于树莓派5
 +
 +
<code>sudo ./install_driver_rpi5.sh veye_mvcam</code>
 +
 +
会在/boot/config.txt中安装CAM1和CAM0两个dtvoerlay。
 +
 +
* 其他树莓派
    
<code>sudo ./install_driver.sh veye_mvcam</code>
 
<code>sudo ./install_driver.sh veye_mvcam</code>
Line 111: Line 251:     
并且/dev/video0 节点存在,证明摄像头状态正常。
 
并且/dev/video0 节点存在,证明摄像头状态正常。
 +
 +
==== 树莓派5的配置 ====
 +
在树莓派5上,驱动程序现在使用media control API,我们必须先正确设置media graph。这包括正确设置media pad的格式并正确链接它们。
 +
 +
我们提供了一系列脚本实现这个功能,保存在rpi5_scripts目录。
 +
 +
* ./find_entity.sh
 +
 +
<code>$ ./find_entity.sh</code>
 +
 +
<code>Found mvcam @ i2c-4 entity on /dev/media3</code>
 +
 +
<code>Plese get frame from /dev/video0 and use /dev/v4l-subdev2 for camera setting.</code>
 +
 +
<code>Found mvcam @ i2c-6 entity on /dev/media0</code>
 +
 +
<code>Plese get frame from /dev/video8 and use /dev/v4l-subdev5 for camera setting.</code>
 +
 +
树莓派5重启之后,相机的media node,video node可能发生变化,因此,建议执行后续操作前执行<code>./find_entity.sh</code>以明确设备节点。
 +
 +
上述提示信息中,可以看到系统插入了两个相机,以及每个相机的对应的设备节点。
 +
 +
<code>i2c-4</code>对应板子上的CAM1插口,<code>i2c-6</code>对应板子上的CAM0插口。
 +
 +
* media_setting_rpi5.sh
 +
 +
<code>./media_setting_rpi5.sh</code>
 +
 +
<code>Usage: ./media_setting_rpi5.sh veyecam2m/csimx307/cssc132/mvcam -fmt [UYVY/RAW8/RAW10/RAW12] -w [width] -h [height]</code>
 +
 +
<code>This shell script is designed to detect the connection of a camera on Raspberry Pi 5.</code>
 +
 +
<code>    It utilizes media-ctl and v4l2-ctl commands to configure the linking relationships and data formats of the media pad.</code>
 +
 +
<code>    Once completed, you can directly use /dev/video0 or /dev/video8 to obtain image data</code>
 +
 +
在进行后续操作前,必须执行此脚本以完成参数的配置。
 +
 +
举例来说,对于RAW-MIPI-AR0234M:
 +
 +
<code>./media_setting_rpi5.sh mvcam -fmt RAW8 -w 1920 -h 1200</code>
 +
 
====v4l2-ctl 应用范例====
 
====v4l2-ctl 应用范例====
 
=====安装v4l2-utils=====
 
=====安装v4l2-utils=====
Line 147: Line 329:  
<small><code>                Size: Discrete 3088x2064</code></small>
 
<small><code>                Size: Discrete 3088x2064</code></small>
   −
<small><code>        [5]: 'UYVY' (UYVY 4:2:2)</code></small>
+
注:对于树莓派5,实际支持的图像格式取决于相机能力,而不是此处的列表。
 
  −
<small><code>                Size: Discrete 3088x2064</code></small>
  −
 
  −
需要特别说明的是,MV系列相机提供的UYVY模式仅作方便调试使用。
      
====== 列出驱动中实现的相机的可配置参数 ======
 
====== 列出驱动中实现的相机的可配置参数 ======
 
<code>v4l2-ctl -L</code>
 
<code>v4l2-ctl -L</code>
   −
<code><small>User Controls</small></code>
+
<code>User Controls</code>
   −
<code><small>                horizontal_flip 0x00980914 (bool)   : default=0 value=0</small></code>
+
<code>                   trigger_mode 0x00981901 (int)    : min=0 max=2 step=1 default=0 value=0 flags=volatile, execute-on-write</code>
   −
<code><small>                  vertical_flip 0x00980915 (bool)   : default=0 value=0</small></code>
+
<code>                    trigger_src 0x00981902 (int)    : min=0 max=1 step=1 default=1 value=1 flags=volatile, execute-on-write</code>
   −
<code><small>                   trigger_mode 0x00981901 (int)    : min=0 max=2 step=1 default=0 value=0 flags=volatile</small></code>
+
<code>                    soft_trgone 0x00981903 (button) : flags=write-only, execute-on-write</code>
   −
<code><small>                    trigger_src 0x00981902 (int)    : min=0 max=1 step=1 default=1 value=1 flags=volatile</small></code>
+
<code>                     frame_rate 0x00981904 (int)    : min=1 max=60 step=1 default=30 value=30 flags=volatile, execute-on-write</code>
   −
<code><small>                    soft_trgone 0x00981903 (button) : flags=write-only, execute-on-write</small></code>
+
<code>                          roi_x 0x00981905 (int)    : min=0 max=1376 step=8 default=0 value=0</code>
   −
<code><small>                     frame_rate 0x00981904 (int)    : min=0 max=22 step=1 default=22 value=22 flags=volatile</small></code>
+
<code>                          roi_y 0x00981906 (int)    : min=0 max=1024 step=4 default=0 value=0</code>
    
*  
 
*  
Line 178: Line 356:  
<code>v4l2-ctl --get-ctrl [ctrl_type]</code>
 
<code>v4l2-ctl --get-ctrl [ctrl_type]</code>
   −
以上所有功能,均可使用[[Mv mipi i2c.sh user guide|mv_mipi_i2c.sh]]实现。
     −
需要指出的是,以上参数在开始取图的状态均不可修改。下面进行逐个说明:
+
注:对于树莓派5,本节的所有使用v4l2-ctl配置参数的命令需要增加 -d参数来指明配置参数使用的subdev。
   −
====== 配置翻转 ======
+
比如执行./media_setting_rpi5.sh或者./find_entity.sh的时候提示使用/dev/v4l-subdev2进行参数配置。
   −
* 水平翻转
+
则<code>v4l2-ctl -L</code>需要变更为<code>v4l2-ctl -L -d /dev/v4l-subdev2</code>。
   −
<code>v4l2-ctl --set-ctrl horizontal_flip=1</code>
     −
* 垂直翻转
+
注:以上所有功能,均可使用[[Mv mipi i2c.sh user guide|mv_mipi_i2c.sh]]实现。
   −
<code>v4l2-ctl --set-ctrl <small>vertical_flip</small>=1</code>
+
需要指出的是,以上参数在开始取图的状态均不可修改。下面进行逐个说明:
    
====== 配置触发模式 ======
 
====== 配置触发模式 ======
Line 217: Line 393:     
====== 设置ROI ======
 
====== 设置ROI ======
举例,对于MV-MIPI-IMX178M:
     −
<code>v4l2-ctl --set-selection=target=crop,top=32,left=64,width=2592,height=1944</code>
+
* 方法1,使用selection
 +
 
 +
<code>v4l2-ctl --set-selection=target=crop,top=0,left=0,width=$WIDTH,height=$HEIGHT</code>
    
设置roi后,最大帧率会自动调整。
 
设置roi后,最大帧率会自动调整。
   −
==== 设置ROI并保存图片 ====
+
注:此方法不适用于树莓派5。
 +
 
 +
* 方法2,使用自定义roi_x,roi_y配合<code>--set-fmt-video</code>
 +
 
 +
<code>v4l2-ctl --set-ctrl roi_x=0</code>
 +
 
 +
<code>v4l2-ctl --set-ctrl roi_y=0</code>
 +
 
 +
<code>v4l2-ctl --set-fmt-video=width=$WIDTH,height=$HEIGHT</code>
 +
==== 流模式 ====
    
===== 设置ROI =====
 
===== 设置ROI =====
以MV-MIPI-IMX178M,3088*2064举例:
+
<code>v4l2-ctl --set-ctrl roi_x=0</code>
 +
 
 +
<code>v4l2-ctl --set-ctrl roi_y=0</code>
 +
 
 +
<code>v4l2-ctl --set-fmt-video=width=$WIDTH,height=$HEIGHT</code>
   −
<code>v4l2-ctl --set-selection=target=crop,top=0,left=0,width=3088,height=2064</code>  
+
===== 设置帧率 =====
 +
<code>v4l2-ctl --set-ctrl frame_rate=$FPS</code>  
   −
===== 流模式下,可使用如下命令进行帧率统计 =====
+
===== 可使用如下命令进行帧率统计 =====
<code>v4l2-ctl --set-fmt-video=width=3088,height=2064,pixelformat=GREY --stream-mmap --stream-count=-1 --stream-to=/dev/null</code>
+
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=GREY --stream-mmap --stream-count=-1 --stream-to=/dev/null</code>
    
===== 保存图片到文件 =====
 
===== 保存图片到文件 =====
<code>v4l2-ctl --set-fmt-video=width=3088,height=2064,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-3104x2064.yuv</code>
+
======MV-MIPI-IMX178M======
 +
 
 +
*raw8格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=3088,height=2064,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-3104x2064.raw</code>
    
或者
 
或者
   −
<code>./yavta -c1 -Fy8-3104x2064.yuv --skip 0 -f Y8 -s 3088x2064 /dev/video0</code>
+
<code>./yavta -c1 -Fy8-3104x2064.raw --skip 0 -f Y8 -s 3088x2064 /dev/video0</code>
 +
 
 +
由于Raspberry Pi为图像申请的内存,宽度为32对齐,高度为16对齐,所以3088*2064的图像将被保存为3104*2064大小。
 +
 
 +
*raw10格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=3088,height=2064,pixelformat='Y10 ' --stream-mmap --stream-count=1 --stream-to=y10-3088x2064.raw</code>
 +
 
 +
*raw12格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=3088,height=2064,pixelformat='Y12 ' --stream-mmap --stream-count=1 --stream-to=y12-3088x2064.raw</code>
 +
======MV-MIPI-SC130M======
 +
 
 +
*raw8格式
   −
PS. y8文件可以用这个播放器: [https://yuv-player-deluxe.software.informer.com/2.6/ YUV Displayer Deluxe].
+
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=1280,height=1024,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-1280x1024.raw</code>
   −
由于树莓派为图片申请的内存,width是32-align的,height是16-align的,因此3088*2064的图像会保存为3104*2064大小。
+
*raw10格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=1280,height=1024,pixelformat='Y10 ' --stream-mmap --stream-count=1 --stream-to=y10-1280x1024.raw</code>
 +
======MV-MIPI-IMX296M ======
 +
 
 +
*raw8格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=1440,height=1088,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-1440x1088.raw</code>
 +
 
 +
*raw10格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=1440,height=1088,pixelformat='Y10 ' --stream-mmap --stream-count=1 --stream-to=y10-1440x1088.raw</code>
 +
======MV-MIPI-IMX265M======
 +
 
 +
*raw8格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=2048,height=1544,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-2048x1544.raw</code>
 +
 
 +
*raw10格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=2048,height=1544,pixelformat='Y10 ' --stream-mmap --stream-count=1 --stream-to=y10-2048x1544.raw</code>
 +
 
 +
*raw12格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=2048,height=1544,pixelformat='Y12 ' --stream-mmap --stream-count=1 --stream-to=y12-2048x1544.raw</code>
 +
======MV-MIPI-IMX264M======
 +
 
 +
*raw8格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=2432,height=2056,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-2432x2056.raw</code>
 +
 
 +
*raw10格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=2432,height=2056,pixelformat='Y10 ' --stream-mmap --stream-count=1 --stream-to=y10-2432x2056.raw</code>
 +
 
 +
*raw12格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=2432,height=2056,pixelformat='Y12 ' --stream-mmap --stream-count=1 --stream-to=y12-2432x2056.raw</code>
 +
======RAW-MIPI-SC132M======
 +
 
 +
*raw8格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=1024,height=1280,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-1024x1280.raw</code>
 +
 
 +
*raw10格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=1024,height=1280,pixelformat='Y10 ' --stream-mmap --stream-count=1 --stream-to=y10-1024x1280.raw</code>
 +
======MV-MIPI-IMX287M======
 +
 
 +
*raw8格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=704,height=544,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-704x544.raw</code>
 +
 
 +
*raw10格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=704,height=544,pixelformat='Y10 ' --stream-mmap --stream-count=1 --stream-to=y10-704x544.raw</code>
 +
 
 +
*raw12格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=704,height=544,pixelformat='Y12 ' --stream-mmap --stream-count=1 --stream-to=y12-704x544.raw</code>
 +
======RAW-MIPI-IMX462M======
 +
 
 +
*raw10格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1088,pixelformat='Y10 ' --stream-mmap --stream-count=1 --stream-to=y10-1920x1088.raw</code>
 +
 
 +
*raw12格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1088,pixelformat='Y12 ' --stream-mmap --stream-count=1 --stream-to=y12-1920x1088.raw</code>
 +
======RAW-MIPI-AR0234M======
 +
 
 +
*raw8格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1200,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to=y8-1920x1200.raw</code>
 +
 
 +
*raw10格式
 +
 
 +
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=1920,height=1200,pixelformat='Y10 ' --stream-mmap --stream-count=1 --stream-to=y10-1920x1200.raw</code>
 +
 
 +
图片格式请参考下面:raw data图片格式说明 章节。
 +
 
 +
===== 实时预览 =====
 +
在树莓派5上,vlc进行播放现在有问题,不能使用。
 +
 
 +
====== 使用vlc播放图像 ======
 +
1. Open VLC with command line <code>vlc</code> , or click the icon to launch.
 +
 
 +
2. Hit the <code>▶</code>(Play) button to call the open media window.
 +
 
 +
3. In <code>Capture Device</code> >> <code>Device Selection</code> >> <code>Video device name</code>, select the camera video node.
 +
 
 +
4. Hit <code>Advanced Options...</code> button
 +
 
 +
5. Type in the <code>width</code> and <code>height</code>, for example, 1280 and 1024.
 +
 
 +
6. Hit <code>OK</code> to save the settings and see the video feed.
 +
[[File:Mvcam via VLC.png|center|thumb|800x800px|Play mv camera using VLC on RPI]]
 +
 
 +
====== 使用qv4l2播放图像 ======
 +
首先安装qv4l2
 +
 
 +
<code>sudo apt install qv4l2</code>
 +
 
 +
1. Open VLC with command line <code>vlc</code> to launch.
 +
 
 +
2. Hit the <code>▶</code>(Play) button to call the open media window.
 +
[[File:Mvcam via qv4l2.png|center|thumb|800x800px|Play mv camera using qv4l2 on RPI]]
 +
<br />
 +
====== 使用gstreamer预览UYVY格式图像 ======
 +
<code>export DISPLAY=:0</code>
 +
 
 +
为了方便进行安装和调试,MV系列相机提供了UYVY模式。UYVY模式支持的最大宽度为2880,使用如下命令可以进行实时预览。
 +
 
 +
注:为了提高最高帧率和带宽,部分模组升级固件后不再提供UYVY格式。具体请通过脚本的fmtcap指令读取寄存器确认。
 +
 
 +
* install gstreamer
 +
 
 +
<code>sudo apt-get install gstreamer1.0-tools</code>
 +
 
 +
<code>sudo apt-get install libx264-dev libjpeg-dev</code>
 +
 
 +
<code>sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-ugly gstreamer1.0-tools gstreamer1.0-gl gstreamer1.0-gtk3</code>
 +
 
 +
* MV-MIPI-IMX178M
 +
 
 +
<code>v4l2-ctl --set-selection=target=crop,top=0,left=0,width=2816,height=2064</code>
 +
 
 +
<code>gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw,format=(string)UYVY, width=(int)2816, height=(int)2064, framerate=(fraction)22/1" ! v4l2convert ! "video/x-raw,format=(string)NV12" ! autovideosink sync=false -v</code>
 +
 
 +
* MV-MIPI-SC130M, MV-MIPI-IMX296M,  MV-MIPI-IMX265M,MV-MIPI-IMX264M,MV-MIPI-IMX287M
 +
 
 +
<code>v4l2-ctl --set-selection=target=crop,top=0,left=0,width=$WIDTH,height=$HEIGHT</code>
 +
 
 +
<code>v4l2-ctl --set-ctrl frame_rate=$FPS</code>
 +
 
 +
<code>gst-launch-1.0 v4l2src device=/dev/video0 ! "video/x-raw,format=(string)UYVY, width=(int)$WIDTH, height=(int)$HEIGHT,framerate=(fraction)$FPS/1" ! v4l2convert ! "video/x-raw,format=(string)NV12" ! autovideosink sync=false -v</code>
 +
 
 +
或者简单的
 +
 
 +
<code>gst-launch-1.0 v4l2src device=/dev/video0 ! videoconvert ! autovideosink</code>
 +
 
 +
====== 使用opencv预览GREY格式图像 ======
 +
 
 +
* install opencv
 +
 
 +
<code>pip uninstall opencv-python</code>
 +
 
 +
<code>sudo apt install python3-opencv</code>
 +
 
 +
* 我们提供了一个简单的[https://github.com/veyeimaging/raspberrypi_v4l2/tree/main/samples/opencv/raw_camera sample]实现此功能:
 +
 
 +
<code>python ./v4l2dev_2_opencv_show_grey.py --width 640 --height 480 --fps 30</code>
 +
 
 +
对于树莓派5,需要增加一个<code>--ctldev /dev/v4l-subdev*</code>参数用于指明配置参数的subdev。
    
==== 触发模式 ====
 
==== 触发模式 ====
 +
本节以IMX178为例,讲述一下触发模式的配置和使用。其他摄像头,参考流模式的宽高推论即可。
 +
 +
===== 设置ROI和帧率 =====
 +
<code>v4l2-ctl --set-ctrl roi_x=0</code>
 +
 +
<code>v4l2-ctl --set-ctrl roi_y=0</code>
   −
===== 设置ROI =====
+
<code>v4l2-ctl --set-fmt-video=width=$WIDTH,height=$HEIGHT</code>
以MV-MIPI-IMX178M,3088*2064举例:
     −
<code>v4l2-ctl --set-selection=target=crop,top=0,left=0,width=3088,height=2064</code>
+
<code>v4l2-ctl --set-ctrl frame_rate=$FPS</code>
 
===== 软触发模式 =====
 
===== 软触发模式 =====
   Line 264: Line 630:     
<code>v4l2-ctl --set-ctrl <small>soft_trgone=1</small></code>
 
<code>v4l2-ctl --set-ctrl <small>soft_trgone=1</small></code>
  −
Notes: 用这种方式第一帧触发的图像无法输出保存。''原因我还没有查清楚。''
      
===== 硬触发模式 =====
 
===== 硬触发模式 =====
Line 282: Line 646:     
====== 开始取图 ======
 
====== 开始取图 ======
<code>v4l2-ctl --set-fmt-video=width=3088,height=2064,pixelformat=GREY --stream-mmap --stream-count=5 --stream-to=y8-3104x2064.yuv</code>
+
<code>v4l2-ctl --set-fmt-video=width=3088,height=2064,pixelformat=GREY --stream-mmap --stream-count=5 --stream-to=y8-3104x2064.raw</code>
    
====== 进行硬触发操作 ======
 
====== 进行硬触发操作 ======
 +
在其他的shell终端,可以多次执行下面命令进行多次触发。
 +
 
<code>python gpio_trigger.py</code>
 
<code>python gpio_trigger.py</code>
    
Note:触发脚本[https://github.com/veyeimaging/mvcam_raspberrypi/tree/main/mv_tools_rpi 链接]。
 
Note:触发脚本[https://github.com/veyeimaging/mvcam_raspberrypi/tree/main/mv_tools_rpi 链接]。
 +
====CM4的补充说明====
 +
cm4支持两路摄像头同时使用,采用上面的步骤安装的dtbo将只能使用CAM1。如需使用两路摄像头,请按如下步骤:
 +
 +
===== 硬件连接 =====
 +
参考树莓派这个[https://www.raspberrypi.com/documentation/computers/compute-module.html 说明],将J6进行短接。
 +
=====更新dt-blob.bin=====
 +
<code>sudo wget <nowiki>https://datasheets.raspberrypi.com/cmio/dt-blob-dualcam.bin</nowiki> -O /boot/dt-blob.bin</code>
 +
=====对于Buster系统(kernel5.10)=====
 +
更新双摄像头的dtbo,
 +
 +
以mvcam为例:
 +
 +
<code>sudo cp raspberrypi_v4l2/release/driver_bin/$(uname -r)/veye_mvcam-cm4.dtbo /boot/overlays/veye_mvcam.dtbo</code>
 +
 +
<code>sudo reboot</code>
 +
=====对于Bullseye系统(kernel5.15+)=====
 +
手动编辑<code>/boot/config.txt</code>文件,增加一行<code>dtoverlay=[camera],cam0</code>,如下所示:
 +
 +
<code>[all]</code>
 +
 +
<code>dtparam=i2c_vc=on</code>
 +
 +
<code>dtoverlay=veye_mvcam</code>
 +
 +
<code>dtoverlay=veye_mvcam,cam0</code>
 +
=====设备文件说明=====
 +
CM4模块采用两路I2C分别与两个摄像头通信。
 +
{| class="wikitable"
 +
!description
 +
!i2c bus num
 +
!lane num
 +
!video node
 +
|-
 +
|CAM0
 +
|0
 +
|2lane
 +
|video0
 +
|-
 +
|CAM1
 +
|10
 +
|2lane or 4lane
 +
|video2(Buster),video1(Bullseye)
 +
|}注:只连一个摄像头,无论CAM0还是CAM1,都是video0。
 
====从源代码编译驱动方法====
 
====从源代码编译驱动方法====
 
请参考:[[Build drivers from source for rpi/zh|树莓派平台上摄像头驱动源码编译指南]]。
 
请参考:[[Build drivers from source for rpi/zh|树莓派平台上摄像头驱动源码编译指南]]。
Line 341: Line 750:     
==== 保存图片 ====
 
==== 保存图片 ====
<code>./mv_raspicam -t 1000 -roi 0,0,3088,2064 -md 0 -sr 10 -o /dev/shm/y8-3104x2064_%04d.yuv</code>
+
<code>./mv_raspicam -t 1000 -roi 0,0,3088,2064 -md 0 -sr 10 -o /dev/shm/y8-3104x2064_%04d.raw</code>
    
-sr是存储图片的间隔,这里每间隔10张图片保存一张。
 
-sr是存储图片的间隔,这里每间隔10张图片保存一张。
Line 348: Line 757:     
完成后在<code>/dev/shm/</code>目录下会保存下几个文件。  
 
完成后在<code>/dev/shm/</code>目录下会保存下几个文件。  
  −
==== 紧密排列的图片格式 ====
  −
mv_raspicam保存的数据格式就是mipi总线上的数据格式,像素和像素之间不会进行空bit位填充。<br />举例来说,12bit Y数据格式,两个像素的数据保存在3个字节中。
  −
{| class="wikitable"
  −
|+12bit Y pixel data
  −
! colspan="8" |Byte3
  −
! colspan="8" |Byte2
  −
! colspan="8" |Byte1
  −
|-
  −
|bit7
  −
|bit6
  −
|bit5
  −
|bit4
  −
|bit3
  −
|bit2
  −
|bit1
  −
|bit0
  −
|bit7
  −
|bit6
  −
|bit5
  −
|bit4
  −
|bit3
  −
|bit2
  −
|bit1
  −
|bit0
  −
|bit7
  −
|bit6
  −
|bit5
  −
|bit4
  −
|bit3
  −
|bit2
  −
|bit1
  −
|bit0
  −
|-
  −
| colspan="12" |Pixel N+1 data
  −
| colspan="12" |Pixel N data
  −
|}
  −
  −
==== 图片大小 ====
  −
Buffersize= ALIGN_UP(width*bit_depth/8,32)*ALIGN_UP(height,16)
  −
  −
行buffersize需要是32字节的整数倍;列buffersize是16字节的整数倍。
  −
  −
举例来说,3088*2064@8bit的图像大小是6406656; 3088*2064@10bit的图像大小是7991808;3088*2064@12bit 的图像大小是9576960。
  −
  −
PS. Y8文件可以用这个播放器: [https://yuv-player-deluxe.software.informer.com/2.6/ YUV Displayer Deluxe]。3088*2064的图像按照3104*2064大小显示。
      
==== 触发模式 ====
 
==== 触发模式 ====
Line 406: Line 769:     
====== 设置触发属性 ======
 
====== 设置触发属性 ======
可以设置触发数量,触发间隔等。下面设置单次触发5张,每张间隔1秒。
+
可以设置触发数量,触发间隔等。下面设置单次触发5张,每张间隔1毫秒。
    
<code>./mv_mipi_i2c.sh -w -f trgnum -p1 5</code>  
 
<code>./mv_mipi_i2c.sh -w -f trgnum -p1 5</code>  
Line 420: Line 783:  
<code>./mv_mipi_i2c.sh -w -f trgone</code>
 
<code>./mv_mipi_i2c.sh -w -f trgone</code>
   −
===== 硬触发 =====
+
===== 硬触发 =====
 +
[[File:MV-MIPI-X-RPI B TRIG 01.jpg|center|thumb|800x800px|MV camera hardware trigger connection|link=http://wiki.veye.cc/index.php/File:MV-MIPI-X-RPI_B_TRIG_01.jpg]]
 
====== 设置模式 ======
 
====== 设置模式 ======
 
本次以高速连续触发为例
 
本次以高速连续触发为例
Line 435: Line 799:  
设置上升沿触发
 
设置上升沿触发
   −
<code>./mv_mipi_i2c.sh -w -f trgedge -p1</code>
+
<code>./mv_mipi_i2c.sh -w -f trgedge -p1 0</code>
    
此外,还可以对硬触发设置丰富的触发属性,如触发延迟、信号过滤等。
 
此外,还可以对硬触发设置丰富的触发属性,如触发延迟、信号过滤等。
Line 446: Line 810:     
Note:触发脚本[https://github.com/veyeimaging/mvcam_raspberrypi/tree/main/mv_tools_rpi 链接]。
 
Note:触发脚本[https://github.com/veyeimaging/mvcam_raspberrypi/tree/main/mv_tools_rpi 链接]。
 +
====CM4的补充说明====
 +
关于硬件连接、dtbo以及i2cbus的描述,请参考前面的章节。
 +
 +
===== mv_raspicam分别访问两个camera的方法: =====
 +
 +
* 预览CAM0
 +
 +
<code>./mv_raspicam -t -1 -c 0 -y 0</code>
 +
 +
* 预览CAM1
 +
 +
<code>./mv_raspicam -t -1 -c 1 -y 10</code>
 +
 +
=== raw data图片格式说明 ===
 +
 +
==== 具有填充位的图片格式 ====
 +
对于10bit深度、12bit深度的像素数据,总是使用两个字节来存储一个像素。用不到的高位以0填充。V4L2标准的'Y10 ' (10-bit Greyscale),'Y12 ' (12-bit Greyscale)格式都是以这种方式存储的。
 +
 +
这种存储方式方便软件处理,缺点是空间占用较大。
 +
 +
==== 紧密排列的图片格式 ====
 +
mv_raspicam保存的数据格式就是mipi总线上的数据格式,像素和像素之间不会进行空bit位填充。
 +
 +
V4L2标准的'Y10P' (10-bit Greyscale (MIPI Packed)),'Y12P' (12-bit Greyscale (MIPI Packed))格式都是以这种方式存储的。
 +
[[File:Packed raw data layer.png|center|thumb|1200x1200px|Packed raw data layer]]
 +
<br />
 +
===== 紧密排列图片大小 =====
 +
Buffersize= ALIGN_UP(width*bit_depth/8,32)*ALIGN_UP(height,16)
 +
 +
行buffersize需要是32字节的整数倍;列buffersize是16字节的整数倍。
 +
 +
举例来说,3088*2064@8bit的图像大小是6406656; 3088*2064@10bit的图像大小是7991808;3088*2064@12bit 的图像大小是9576960。
 +
 +
==== 转换工具 ====
 +
我们编写了一个小工具:[https://github.com/veyeimaging/pixel_layer_convert pixel_layer_convert],可以很方便的将紧密排列的图片转为具有填充位的图片。
 +
 +
比如下面的命令,可以将一个3088宽度的packed raw10 图片转为unpacked raw10。
 +
 +
<code>./pixel_layer_convert -I Y10P -i y10-3088x2064_0001.raw -o y10-3088x2064_0001_new.raw -w 3088</code>
 +
 +
==== raw图片播放器 ====
 +
推荐使用[https://www.offminor.de/ vooya]作为播放器,支持GREY, 和具有填充位的图片格式。
 +
 +
Y8文件可以用这个播放器: [https://yuv-player-deluxe.software.informer.com/2.6/ YUV Displayer Deluxe]。
 +
 
=== shell脚本进行参数配置 ===
 
=== shell脚本进行参数配置 ===
 
我们提供了shell脚本来配置参数。
 
我们提供了shell脚本来配置参数。
 +
 +
https://github.com/veyeimaging/raspberrypi_v4l2/tree/main/mv_tools_rpi
    
[[mv_mipi_i2c.sh user guide]]
 
[[mv_mipi_i2c.sh user guide]]
Line 461: Line 872:     
=== 本文修改记录 ===
 
=== 本文修改记录 ===
 +
 +
* 2024-01-01
 +
 +
增加对树莓派5的相关说明。
 +
 +
*2023-08-16
 +
 +
增加对RAW-MIPI-IMX462M和RAW-MIPI-AR0234M的支持。
 +
 +
* 2023-06-07
 +
 +
增加使用qv4l2和VLC预览画面的方法。
 +
 +
* 2023-04-14
 +
 +
配合新版本驱动,去掉了翻转操作,增加了一种roi配置方法。
 +
 +
* 20230329
 +
 +
增加opencv sample。
 +
 +
*20230326
 +
 +
增加MV-MIPI-IMX287M的支持。
 +
 +
*20230304
 +
 +
增加Bullseye系统中CM4的相关说明。
 +
 +
* 20230210
 +
 +
V4L2模式下增加了CM4的说明。
 +
 +
*20221208
 +
 +
增加了MV-MIPI-IMX264M的支持。
 +
 +
* 20221102
 +
 +
增加了IMX265和SC132新型号的支持。
 +
 +
* 2022-05-16
 +
 +
提供了图片格式转换工具。
    
* 2022-04-14
 
* 2022-04-14
    
第一个版本
 
第一个版本

Navigation menu