Difference between revisions of "Gx series camera appnotes 4 rpi/zh"

From wiki_veye
Jump to navigation Jump to search
(Created page with "English === 概述 === MV系列相机是为工业领域的AI应用推出的相机。其使用MIPI CSI-2接口,尤其适合嵌入式运...")
 
 
(79 intermediate revisions by 2 users not shown)
Line 1: Line 1:
[[Mv series camera appnotes 4 rpi|English]]
+
[[Gx series camera appnotes 4 rpi|English]]
  
=== 概述 ===
+
===概述===
MV系列相机是为工业领域的AI应用推出的相机。其使用MIPI CSI-2接口,尤其适合嵌入式运算平台使用。它具备丰富的数据格式和触发特性,极低的延时,极高的带宽和可靠的稳定性。
+
GX系列相机是为嵌入式的AI应用推出的相机,具备卓越的ISP性能,多种工作模式,丰富的功能选项,可靠的稳定性设计。其使用MIPI CSI-2接口,尤其适合嵌入式运算平台使用。
  
本文介绍了如何在树莓派平台使用MV系列相机。
+
本文介绍了如何在树莓派平台使用GX系列相机。
  
==== 支持的模组 ====
+
====支持的模组====
 
{| class="wikitable"
 
{| class="wikitable"
 
!系列
 
!系列
Line 12: Line 12:
 
!状态
 
!状态
 
|-
 
|-
|MV系列
+
|GX系列
|MV-MIPI-IMX178M
+
|GX-MIPI-IMX662
|完成
 
|-
 
|MV系列
 
|MV-MIPI-SC130M
 
|完成
 
|-
 
|MV系列
 
|MV-MIPI-IMX287M
 
|完成
 
|-
 
|MV系列
 
|MV-MIPI-IMX296M
 
|完成
 
|-
 
|MV系列
 
|MV-MIPI-IMX265M
 
|完成
 
|-
 
|MV系列
 
|MV-MIPI-IMX264M
 
|完成
 
|-
 
|MV系列
 
|MV-MIPI-GMAX4002M
 
|完成
 
|-
 
|RAW系列
 
|RAW-MIPI-SC132M
 
|完成
 
|-
 
|RAW系列
 
|RAW-MIPI-IMX462M
 
|完成
 
|-
 
|RAW系列
 
|RAW-MIPI-AR0234M
 
|完成
 
|-
 
|RAW系列
 
|RAW-MIPI-SC535M
 
 
|完成
 
|完成
 
|}
 
|}
<br />
 
 
=== 硬件准备及安装 ===
 
 
==== MV系列摄像头使用ADP-MV1的连接方式 ====
 
MV系列相机需要使用ADP-MV1转接板才能连接到树莓派。
 
 
===== MV系列摄像头与ADP-MV1的连接 =====
 
二者使用0.5mm间距*30P的FFC异面线连接,注意接触面向外。
 
{| class="wikitable"
 
!TOP
 
!BOTTOM
 
|-
 
|[[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供电,可以使用杜邦线直接从树莓派主板取电。
 
[[File:ADP-MV1-MV-MIPI-X 07.jpg|center|thumb|800x800px|ADP-MV1 power supply]]
 
<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+ =====
 
二者使用1mm间距*15P的FFC异面线连接,注意接触面安装方向。
 
[[File:MV-MIPI-X-RPI B 01.jpg|alt=MV camera and RPI connection|center|thumb|800x800px|MV camera and RPI connection]]
 
<br />
 
 
===== 树莓派Zero,Zero W和Computer Module =====
 
二者使用15P转22P的FFC同面线连接,注意接触面安装方向。
 
[[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:CM5-MV-connect.jpg|center|thumb|800x800px|MV camera connect to CM5]]
 
<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 />
 
  
===== 树莓派Model B和Model B+ =====
+
===硬件准备及安装===
RAW-MIPI-SC132M使用15pin异面FFC线,其他RAW系列相机使用15to22pin同面FFC线。
+
GX系列相机使用树莓派兼容的22pin接口,但是需要独立的5V DC供电。
[[File:RAW-MIPI-AR0234-RPI4.jpg|center|thumb|800x800px|RAW series camera and RPI connection]]
 
  
===== 树莓派Zero,Zero W和Computer Module =====
+
====GX系列摄像头与22pin接口树莓派连接方式====
RAW-MIPI-SC132M使用15to22pin同面FFC线,其他RAW系列相机使用22pin异面FFC线。
+
<br />[[File:Gx Camera to RaspberryPi5.png|center|thumb|800x800px|GX Camera to RaspberryPi5]]<br />
[[File:RAW-MIPI-AR0234-RPI ZERO.jpg|center|thumb|800x800px|RAW-MIPI-AR0234-RPI ZERO]]
+
====GX系列相机与 15pin接口的树莓派之间的连接方式====
[[File:CM5-RAW-connect.jpg|center|thumb|800x800px|RAW-MIPI-SC535M connect to CM5]]
+
<br />[[File:Gx to raspberry4 resized .png|alt=GX Camera to RaspberryPi4|center|thumb|800x800px|GX Camera to RaspberryPi4]]
 
<br />
 
<br />
=== piOS的配置 ===
+
===驱动安装及验证===
具体安装树莓派系统方法请参考官方文档,详见:[https://www.raspberrypi.org/documentation/installation/ Install raspberrypi guide]。
+
我们在这个[https://github.com/veyeimaging/raspberrypi_v4l2 github仓库]保存了驱动代码,i2c工具集,配置脚本等内容。
 
 
接通电源后,树莓派系统启动,初始树莓派系统中Camera 和 I2C都处于未启用状态。开机后我们需要将其手动打开,执行命令
 
 
 
<code>sudo raspi-config</code>
 
[[File:Raspi-config bullseye.png|alt=|center|thumb|608x608px|raspi-config bullseye]]
 
进入Interface Options,启用I2C,然后重启树莓派。
 
 
 
建议启用树莓派系统的ssh服务及samba服务,这里不再赘述树莓派系统如何开启ssh和samba服务。
 
=== V4L2模式和Legacy模式介绍 ===
 
在最新的树莓派bookworm系统中,已经去掉了对Legacy模式的支持。建议客户使用V4L2模式。
 
 
 
==== libcamera以及V4L2模式 ====
 
现在piOS已全面切换为libcamera-stack模式。
 
 
 
libcamera-stack本质上以实现isp功能为核心,这点是MV系列相机不需要的。因此,我们采用了'''V4L2模式''',而不是使用libcamera-stack。
 
 
 
与libcamera-stack相同,我们的'''V4L2模式''',也实现了linux驱动层标准的V4L2驱动。基于此驱动,应用层可以直接开发程序获取图像并进行进一步处理。
 
 
 
==== Legacy模式 ====
 
传统模式,依赖博通的GPU进行图像处理。传统的raspicam软件集即采用此模式。此模式缺点是封闭。GPU端是闭源的,无法自由接入sensor。树莓派组织已经全面转向libcamera camera stack。
 
 
 
但是此模式依然有存在的价值:
 
 
 
# 更多的使用GPU资源,降低CPU负载。这点对于性能比较差的早期版本树莓派很有用。
 
# 可以简单直接的获取图像数据到应用层,无需驱动层的支持。这点对于不依赖树莓派做isp的相机尤其有用。
 
#libcamera现在还缺乏一些功能支持。
 
 
 
有两种方法可以使用Legacy模式:
 
 
 
# 使用Legacy版本的piOS。
 
# 对于bullseye版本piOS,<code>raspi-config</code>中打开Legacy Camera选项。
 
 
 
由于两种工作模式不能共存,因此使用V4L2模式时需要关闭Legacy模式。
 
=== V4L2模式用法 ===
 
我们在这个[https://github.com/veyeimaging/raspberrypi_v4l2 github仓库]保存了v4l2模式的代码。
 
  
 
国内用户可以使用[https://gitee.com/veyeimaging/raspberrypi_v4l2 gitee仓库]。
 
国内用户可以使用[https://gitee.com/veyeimaging/raspberrypi_v4l2 gitee仓库]。
Line 165: Line 43:
 
<code>chmod +x *</code>
 
<code>chmod +x *</code>
  
* 对于树莓派5
+
*对于树莓派5
  
<code>sudo ./install_driver_rpi5.sh veye_mvcam</code>
+
<code>sudo ./install_driver_rpi5.sh veye_gxcam</code>
  
 
会在/boot/config.txt中安装CAM1和CAM0两个dtvoerlay。
 
会在/boot/config.txt中安装CAM1和CAM0两个dtvoerlay。
  
* 其他树莓派
+
*其他树莓派
  
<code>sudo ./install_driver.sh veye_mvcam</code>
+
<code>sudo ./install_driver.sh veye_gxcam</code>
  
 
然后重启树莓派。
 
然后重启树莓派。
  
 
备注:如果提示无法找到对应版本的驱动,说明我们没有提供对应您的piOS版本编译后的驱动程序。请尝试从源码编译。
 
备注:如果提示无法找到对应版本的驱动,说明我们没有提供对应您的piOS版本编译后的驱动程序。请尝试从源码编译。
 
===== mvcam使用4lane模式 =====
 
对于mvcam,默认的dtbo是2lane的,如需使用4lane模式,请先确认你的树莓派主板和相机都支持4lane。如树莓派或者相机不支持4lane模式,而误用4lane模式dtbo,则会导致无法正确取图。
 
 
然后,请在驱动安装完成后,额外执行:
 
 
<code>sudo cp driver_bin/$(uname -r)/veye_mvcam_4lane.dtbo /boot/overlays/veye_mvcam.dtbo</code>
 
 
 
====卸载驱动====
 
====卸载驱动====
如需更换为Legacy模式,或者想要更换成其他摄像头模组型号的驱动,必须要先卸载现在的驱动。
+
如需更换成其他摄像头模组型号的驱动,必须要先卸载现在的驱动。
  
<code>sudo ./uninstall_driver.sh veye_mvcam</code>
+
<code>sudo ./uninstall_driver.sh veye_gxcam</code>
 
====系统状态验证====
 
====系统状态验证====
以MV-MIPI-IMX178M为例:
+
以GX-MIPI-IMX662为例:
 
 
<code>dmesg | grep mvcam</code>
 
  
可以看到linux启动阶段probe到的相机型号和以及相机的版本号:
+
<code>dmesg | grep gxcam</code>
  
<code>camera is: MV-MIPI-IMX178M</code>
+
可以看到linux启动阶段probe到的相机型号:
  
<code>firmware version: 0x1080102</code>
+
<code>camera is: GX-MIPI-IMX662</code>
  
 
并且/dev/video0 节点存在,证明摄像头状态正常。
 
并且/dev/video0 节点存在,证明摄像头状态正常。
  
==== veye_viewer ====
+
===状态检测并配置环境变量===
veye_viewer是一个开源的,基于QT5的客户端软件。
+
在[https://github.com/veyeimaging/raspberrypi_v4l2/tree/main/gx_i2c_tools 这里],我们提供了一个<code>gx_probe.sh</code>脚本,用于自动检测识别到的相机并将相机默认的型号、宽、高、帧率等信息配置到环境变量中。
 
 
代码以及使用请参考:https://github.com/veyeimaging/veye_viewer<nowiki/>。
 
 
 
国内用户可访问[https://gitee.com/veyeimaging/veye_viewer gitee仓库]。
 
==== 状态检测并配置环境变量 ====
 
在[https://github.com/veyeimaging/raspberrypi_v4l2/tree/main/mv_tools_rpi 这里],我们提供了一个<code>mv_probe.sh</code>脚本,用于自动检测识别到的相机并将相机默认的型号、宽、高、帧率等信息配置到环境变量中。
 
  
 
使用方法是:
 
使用方法是:
  
<code>source ./mv_probe.sh</code>
+
<code>$ source ./gx_probe.sh i2c_bus</code>
  
 
一个典型的输出如下:
 
一个典型的输出如下:
  
<code>$ source ./mv_probe.sh</code>  
+
<code>$ source ./gx_probe.sh 10</code>  
  
<code>The mvcam driver is loaded on i2c-10, but the camera is not detected!</code>
+
<code>The gxcam driver is loaded on i2c-10, but the camera is not detected!</code>
  
<code>Found veye_mvcam camera on i2c-11.</code>
+
<code>Found veye_gxcam camera on i2c-10.</code>
  
<code>Setenv CAMERAMODEL = RAW-MIPI-SC535M</code>
+
<code>Setenv CAMERAMODEL = GX-MIPI-IMX662</code>
  
<code>Setenv FPS = 49</code>
+
<code>Setenv FPS = 60</code>
  
<code>Setenv WIDTH = 2432</code>
+
<code>Setenv WIDTH = 1920</code>
  
<code>Setenv HEIGHT = 2048</code>
+
<code>Setenv HEIGHT = 1080</code>
  
 
可以通过 <code>echo $CAMERAMODEL</code>来验证环境变量的输出结果。注意,此环境变量只对当前会话有效。
 
可以通过 <code>echo $CAMERAMODEL</code>来验证环境变量的输出结果。注意,此环境变量只对当前会话有效。
 
+
===树莓派5的配置===
注意:此脚本需要mvcam的驱动版本大于等于1.1.06才可以支持。
 
 
 
如你使用的驱动版本小于1.1.06,或者你希望使用不同于当前值的宽、高、帧率。请参考相机模组的手册,手动配置如下<code>WIDTH HEIGHT FPS</code>环境变量,否则可能导致后面的程序运行不正常。如:
 
 
 
<code>export WIDTH=2432</code>
 
 
 
<code>export HEIGHT=2048</code>
 
 
 
<code>export FPS=50</code>
 
==== 树莓派5的配置 ====
 
 
在树莓派5上,驱动程序现在使用media control API,我们必须先正确设置media graph。这包括正确设置media pad的格式并正确链接它们。
 
在树莓派5上,驱动程序现在使用media control API,我们必须先正确设置media graph。这包括正确设置media pad的格式并正确链接它们。
  
 
我们提供了一系列脚本实现这个功能,保存在rpi5_scripts目录。
 
我们提供了一系列脚本实现这个功能,保存在rpi5_scripts目录。
  
* ./find_entity.sh  
+
*./find_entity.sh
  
 
<code>$ ./find_entity.sh</code>  
 
<code>$ ./find_entity.sh</code>  
  
<code>Found mvcam @ i2c-4 entity on /dev/media3</code>
+
<code>This is a Raspberry Pi 5.</code>
  
<code>Plese get frame from /dev/video0 and use /dev/v4l-subdev2 for camera setting.</code>
+
<code>Kernel version is 6.12.47, use i2c-10 for CAM0 and i2c-11 for CAM1.</code>
  
<code>Found mvcam @ i2c-6 entity on /dev/media0</code>
+
<code>Found gxcam @ i2c-10 entity on /dev/media3</code>
  
<code>Plese get frame from /dev/video8 and use /dev/v4l-subdev5 for camera setting.</code>
+
<code>Plese get frame from /dev/video0 and use /dev/v4l-subdev2 for camera setting.</code>
  
 
树莓派5重启之后,相机的media node,video node可能发生变化,因此,建议执行后续操作前执行<code>./find_entity.sh</code>以明确设备节点。
 
树莓派5重启之后,相机的media node,video node可能发生变化,因此,建议执行后续操作前执行<code>./find_entity.sh</code>以明确设备节点。
Line 264: Line 116:
 
上述提示信息中,可以看到系统插入了两个相机,以及每个相机的对应的设备节点。
 
上述提示信息中,可以看到系统插入了两个相机,以及每个相机的对应的设备节点。
  
<code>i2c-4</code>对应板子上的CAM1插口,<code>i2c-6</code>对应板子上的CAM0插口。
+
<code>i2c-10</code>对应板子上的CAM0插口,<code>i2c-11</code>对应板子上的CAM1插口。
  
* media_setting_rpi5.sh
+
*media_setting_rpi5.sh
  
<code>./media_setting_rpi5.sh</code>  
+
<code>$ ./media_setting_rpi5.sh</code>  
  
 
<code>This is a Raspberry Pi 5.</code>
 
<code>This is a Raspberry Pi 5.</code>
  
<code>Kernel version is 6.6.51, do not support unpacked format.</code>
+
<code>Kernel version is 6.12.47, do not support unpacked format.</code>
 +
 
 +
<code>Kernel version is 6.12.47, use i2c-10 for CAM0 and i2c-11 for CAM1.</code>
  
<code>Usage: ./media_setting_rpi5.sh veyecam2m/csimx307/cssc132/mvcam -fmt [UYVY/RAW8/RAW10/RAW12] -x [roi_x] -y [roi_y] -w [width] -h [height] -c [cam 0|1]</code>
+
<code>Usage: ./media_setting_rpi5.sh veyecam2m/csimx307/cssc132/mvcam/gxcam -fmt [UYVY/RAW8/RAW10/RAW12] -x [roi_x] -y [roi_y] -w [width] -h [height] -c [cam 0|1]</code>
  
<code>This shell script is designed to detect the connection of a camera on Raspberry Pi 5.</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>    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>
 
<code>    Once completed, you can directly use /dev/video0 or /dev/video8 to obtain image data.</code>
Line 284: Line 138:
 
在进行后续操作前,必须执行此脚本以完成参数的配置。
 
在进行后续操作前,必须执行此脚本以完成参数的配置。
  
举例来说,对于接到CAM0口的RAW-MIPI-AR0234M:
+
举例来说,对于接到CAM0口的GX-MIPI-IMX662:
  
<code>./media_setting_rpi5.sh mvcam -fmt RAW8 -x 0 -y 0 -w 1920 -h 1200 -c 0</code>
+
<code>./media_setting_rpi5.sh gxcam -fmt UYVY -x 0 -y 0 -w 1920 -h 1080 -c 0</code>
  
====v4l2-ctl 应用范例====
+
===实时预览===
=====安装v4l2-utils=====
+
====使用veye_viewer播放图像====
<code>sudo apt-get install v4l-utils</code>
 
=====yavta安装=====
 
<code>git clone <nowiki>git://git.ideasonboard.org/yavta.git</nowiki></code>
 
  
<code>cd yavta;make</code>
+
veye_viewer是一个基于QT的开源的客户端软件,可以方便客户进行相机评测、参数配置。另外其操作日志、寄存器清单以及开源的特性,方便客户进行参考,二次开发。
===== 使用v4l2-ctl配置参数 =====
 
  
====== 列出相机支持的数据格式 ======
+
可通过[https://github.com/veyeimaging/veye_viewer veye_viewer]下载源码,或在其发行版中直接下载对应平台的可执行程序。
<code>v4l2-ctl --list-formats-ext</code>
 
  
<small><code>ioctl: VIDIOC_ENUM_FMT</code></small>
+
国内用户可访问[https://gitee.com/veyeimaging/veye_viewer gitee仓库]。
  
<small><code>        Type: Video Capture</code></small>
+
====使用qv4l2播放图像====
 +
首先安装qv4l2
  
<small><code>        [0]: 'GREY' (8-bit Greyscale)</code></small>
+
<code>sudo apt install qv4l2</code>
  
<small><code>                Size: Discrete 3088x2064</code></small>
+
注:对于树莓派5,需要在执行qv4l2播放图像前先执行前面所述media_setting_rpi5.sh脚本,以进行准备工作。
  
<small><code>        [1]: 'Y10P' (10-bit Greyscale (MIPI Packed))</code></small>
+
1. 在命令行中输入qv4l2以启动 V4L2 播放器。
  
<small><code>                Size: Discrete 3088x2064</code></small>
+
2. 点击 ▶(播放)按钮以调出打开的媒体窗口。
  
<small><code>        [2]: 'Y10 ' (10-bit Greyscale)</code></small>
+
<br />
 +
[[File:Mvcam via qv4l2.png|center|thumb|800x800px|Play gx camera using qv4l2 on RPI]]
 +
<br />
 +
===Gstreamer应用范例===
 +
<code>export DISPLAY=:0</code>
  
<small><code>                Size: Discrete 3088x2064</code></small>
+
====安装gstreamer====
 +
<code>sudo apt-get install gstreamer1.0-tools</code>
  
<small><code>        [3]: 'Y12P' (12-bit Greyscale (MIPI Packed))</code></small>
+
<code>sudo apt-get install libx264-dev libjpeg-dev</code>
  
<small><code>                Size: Discrete 3088x2064</code></small>
+
<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>
  
<small><code>        [4]: 'Y12 ' (12-bit Greyscale)</code></small>
+
====使用gstreamer====
 +
通过[https://github.com/veyeimaging/raspberrypi_v4l2/tree/main/samples/gstreamer/yuv_camera gstreamer]中的脚本,可实现图像预览,图片抓拍,h264视频编码保存成mp4/mkv格式等功能。
  
<small><code>                Size: Discrete 3088x2064</code></small>
+
====网络传输 TCP streaming====
 +
'''''树莓派(Server)一侧执行'''''
  
注:对于树莓派5,实际支持的图像格式取决于相机能力,而不是此处的列表。
+
<code>gst-launch-1.0 -v v4l2src device=/dev/video0 num-buffers=-1 ! "video/x-raw,format=(string)UYVY, width=(int)1920, height=(int)1080,framerate=(fraction)30/1" ! v4l2h264enc extra-controls="controls, h264_profile=4, video_bitrate=4000000" ! 'video/x-h264, profile=high, level=(string)4' ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink  host=x.x.x.x port=5000</code>
  
====== 列出驱动中实现的相机的可配置参数 ======
+
码流带宽为4Mbps,持续传输,监听端口为5000。
<code>v4l2-ctl -L</code>
 
  
<code>User Controls</code>
+
'''''Client一侧执行'''''
  
<code>                   trigger_mode 0x00981901 (int)    : min=0 max=2 step=1 default=0 value=0 flags=volatile, execute-on-write</code>
+
<code>gst-launch-1.0 -v tcpclientsrc host=x.x.x.x port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! autovideosink sync=false</code>
  
<code>                    trigger_src 0x00981902 (int)    : min=0 max=1 step=1 default=1 value=1 flags=volatile, execute-on-write</code>
+
其中x.x.x.x为树莓派(Server)的IP地址。
  
<code>                    soft_trgone 0x00981903 (button) : flags=write-only, execute-on-write</code>
+
Client一侧,如为windows系统,建议使用powershell。[https://gstreamer.freedesktop.org/ gstreamer]的windows版本[https://gstreamer.freedesktop.org/documentation/installing/on-windows.html?gi-language=c 下载地址]。只安装runtime files即可。
 +
===yavta 应用范例===
  
<code>                     frame_rate 0x00981904 (int)    : min=1 max=60 step=1 default=30 value=30 flags=volatile, execute-on-write</code>
+
====下载并编译yavta====
 +
<code>git clone <nowiki>git://git.ideasonboard.org/yavta.git</nowiki></code>
  
<code>                          roi_x 0x00981905 (int)    : min=0 max=1376 step=8 default=0 value=0</code>
+
<code>$ cd yavta;make</code>
  
<code>                          roi_y 0x00981906 (int)    : min=0 max=1024 step=4 default=0 value=0</code>
+
====yavta 例程====
 +
<code>./yavta -c1 -F"y8-${WIDTH}x${HEIGHT}.yuv" --skip 0 -f UYVY -s "${WIDTH}x${HEIGHT}" /dev/video0</code>
  
*
+
例<code>$ ./yavta -c1 -Fuyvy_1920X1080.yuv --skip 0 -f UYVY -s 1920x1080 /dev/video0</code>
 +
===使用opencv获取图片===
 +
====使用opencv预览UYVY格式图像====
  
可以使用下面的方法设置和获取参数。
+
*install opencv
  
<code>v4l2-ctl --set-ctrl [ctrl_type]=[val]</code>
+
<code>$ sudo apt install python3-opencv</code>
  
<code>v4l2-ctl --get-ctrl [ctrl_type]</code>
+
*为了将摄像头数据从v4l2设备导入到opencv,我们提供了几个[https://github.com/veyeimaging/raspberrypi_v4l2/tree/main/samples/opencv/yuv_camera sample]
  
 +
<code>$ python ./v4l2_opencv_show2.py --width 1920 --height 1080 --fps 30</code>
  
注:对于树莓派5,本节的所有使用v4l2-ctl配置参数的命令需要增加 -d参数来指明配置参数使用的subdev。
+
对于树莓派5,需要增加一个<code>--ctldev /dev/v4l-subdev*</code>参数用于指明配置参数的subdev。
 +
===v4l2-ctl 应用范例===
 +
====安装v4l2-utils====
 +
<code>$ sudo apt-get install v4l-utils</code>
  
比如执行./media_setting_rpi5.sh或者./find_entity.sh的时候提示使用/dev/v4l-subdev2进行参数配置。
+
====v4l2-ctl例程====
  
则<code>v4l2-ctl -L</code>需要变更为<code>v4l2-ctl -L -d /dev/v4l-subdev2</code>。
+
*抓拍一张UYVY原始数据图片 (1080p mode)
  
注:以上所有功能,均可使用[[Mv mipi i2c.sh user guide|mv_mipi_i2c.sh]]实现。
+
<code>v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=UYVY --stream-mmap --stream-count=1 --stream-to=uyvy-1920x1080.yuv</code>
  
需要指出的是,以上参数在开始取图的状态均不可修改。下面进行逐个说明:
+
*抓拍10张UYVY原始数据图片 (1080p mode)
  
====== 配置触发模式 ======
+
<code>v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=UYVY --stream-mmap --stream-count=10 --stream-to=uyvy-1920x1080_stream.yuv</code>
<code>v4l2-ctl --set-ctrl <small>trigger_mode=[0-2]</small></code>
 
  
0:流模式
+
====列出相机支持的数据格式====
 +
<code>v4l2-ctl --list-formats-ext</code>
  
1:普通触发模式
+
<small><code>ioctl: VIDIOC_ENUM_FMT</code></small>
  
2:快速连续触发模式
+
<small><code>        Type: Video Capture</code></small>
  
====== 配置触发源 ======
+
<small><code>        [0]: 'UYVY' (UYVY 4:2:2)</code></small>
<code>v4l2-ctl --set-ctrl <small>trigger_src=[0-1]</small></code>
 
  
0: 软触发
+
<small><code>                Size: Discrete 1920x1080</code></small>
  
1: 硬触发
+
<small><code>        [1]: 'YUYV' (YUYV 4:2:2)</code></small>
  
====== 软触发一次 ======
+
注:对于树莓派5,实际支持的图像格式取决于相机能力,而不是此处的列表。
<code>v4l2-ctl --set-ctrl <small>soft_trgone=1</small></code>
 
  
====== 设置帧率 ======
+
====使用v4l2-ctl配置参数====
<code>v4l2-ctl --set-ctrl frame_rate=[1-max]</code>
+
<code>v4l2-ctl -d /dev/v4l-subdev2 -L</code>
  
随分辨率的调整,最大帧率会自动更新。
+
<code>User Controls</code>
  
====== 设置ROI ======
+
<code>                   work_mode 0x00981a01 (int)    : min=0 max=4 step=1 default=0 value=0 flags=volatile, execute-on-write</code>
  
* 方法1,使用selection
+
<code>                    trigger_src 0x00981a02 (int)    : min=0 max=1 step=1 default=1 value=1 flags=volatile, execute-on-write</code>
  
<code>v4l2-ctl --set-selection=target=crop,top=0,left=0,width=$WIDTH,height=$HEIGHT</code>
+
<code>                    soft_trgone 0x00981a03 (button) : value=0 flags=write-only, execute-on-write</code>
  
设置roi后,最大帧率会自动调整。
+
<code>                      sync_role 0x00981a04 (int)    : min=0 max=1 step=1 default=0 value=0 flags=volatile, execute-on-write</code>
  
注:此方法不适用于树莓派5。
+
<code>                     frame_rate 0x00981a05 (int)    : min=0 max=60 step=1 default=60 value=60 flags=volatile, execute-on-write</code>
  
* 方法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 -d /dev/v4l-subdev2 --set-ctrl [ctrl_type]=[val]</code>
  
<code>v4l2-ctl --set-fmt-video=width=$WIDTH,height=$HEIGHT</code>
+
<code>v4l2-ctl -d /dev/v4l-subdev2 --get-ctrl [ctrl_type]</code>
  
备注:对于树莓派5,可以直接使用media_setting_rpi5.sh脚本完成roi的配置,因为media_setting_rpi5.sh脚本中已经包含roi配置。
+
注:对于树莓派5,本节的所有使用v4l2-ctl配置参数的命令需要增加 -d参数来指明配置参数使用的subdev。
==== 流模式 ====
 
  
===== 设置ROI =====
+
比如执行<code>./media_setting_rpi5.sh</code>或者<code>./find_entity.sh</code>的时候提示使用<code>/dev/v4l-subdev2</code>进行参数配置。
<code>v4l2-ctl --set-ctrl roi_x=0</code>
 
  
<code>v4l2-ctl --set-ctrl roi_y=0</code>
+
<code>v4l2-ctl -L</code>需要变更为<code>v4l2-ctl -L -d /dev/v4l-subdev2</code>
  
<code>v4l2-ctl --set-fmt-video=width=$WIDTH,height=$HEIGHT</code>
+
注:以上所有功能,均可使用[[Gx mipi i2c.sh user guide/zh|gx_mipi_i2c.sh]]实现。
  
===== 设置帧率 =====
+
需要指出的是,以上参数在开始取图的状态均不可修改。下面进行逐个说明:
<code>v4l2-ctl --set-ctrl frame_rate=$FPS</code>  
+
=====配置触发模式=====
 +
<code>$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>work_mode=[0-2]</small></code>
  
===== 可使用如下命令进行帧率统计 =====
+
0:流模式
<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>
 
  
===== 保存图片到文件 =====
+
1:普通触发模式
  
*raw8格式
+
4:多相机同步模式
 +
=====配置触发源=====
 +
<code>$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>trigger_src=[0-1]</small></code>
  
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=GREY --stream-mmap --stream-count=1 --stream-to="y8-${WIDTH}x${HEIGHT}.raw"</code>
+
0: 软触发
  
或者
+
1: 硬触发
  
<code>./yavta -c1 -F"y8-${WIDTH}x${HEIGHT}.raw" --skip 0 -f Y8 -s "${WIDTH}x${HEIGHT}" /dev/video0</code>
+
=====软触发一次=====
 +
<code>$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>soft_trgone=1</small></code>
 +
=====设置帧率=====
 +
<code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl frame_rate=[1-max]</code>
  
*raw10格式
+
随分辨率的调整,最大帧率会自动更新。
 
 
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat='Y10 ' --stream-mmap --stream-count=1 --stream-to="y10-${WIDTH}x${HEIGHT}.raw"</code>
 
 
 
*raw12格式
 
 
 
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat='Y12 ' --stream-mmap --stream-count=1 --stream-to="y12-${WIDTH}x${HEIGHT}.raw"</code>
 
 
 
由于Raspberry Pi为图像申请的内存,宽度为32对齐,高度为16对齐,所以3088*2064的图像将被保存为3104*2064大小。
 
 
 
图片格式请参考下面:raw data图片格式说明 章节。
 
 
 
===== 实时预览 =====
 
在最新版树莓派piOS,vlc进行播放现在有问题,不能使用,请使用qv4l2代替。
 
 
 
====== 使用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>$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl work<small>_mode=1</small></code>
  
<code>sudo apt install qv4l2</code>
+
<code>$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>trigger_src=0</small></code>
  
1. Open VLC with command line <code>vlc</code> to launch.
+
======开始取图======
 +
<code>v4l2-ctl --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=UYVY --stream-mmap --stream-count=5 --stream-to="uyvy-${WIDTH}x${HEIGHT}.yuv"</code>
  
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 />
 
====== 使用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。
 
 
 
====== 使用gstreamer预览GREY格式图像 ======
 
<code>export DISPLAY=:0</code>
 
 
 
<code>gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=GRAY8,width=$WIDTH,height=$HEIGHT,framerate=$FPS/1 ! videoconvert ! autovideosink</code>
 
 
 
==== 触发模式 ====
 
本节以IMX178为例,讲述一下触发模式的配置和使用。其他摄像头,参考流模式的宽高推论即可。
 
 
 
===== 设置ROI和帧率 =====
 
<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-ctrl frame_rate=$FPS</code>
 
===== 软触发模式 =====
 
 
 
====== 设置模式 ======
 
<code>v4l2-ctl --set-ctrl <small>trigger_mode=1</small></code>
 
 
 
<code>v4l2-ctl --set-ctrl <small>trigger_src=0</small></code>
 
 
 
====== 开始取图 ======
 
<code>v4l2-ctl --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=GREY --stream-mmap --stream-count=5 --stream-to="y8-${WIDTH}x${HEIGHT}.raw"</code>
 
 
 
====== 进行软触发操作 ======
 
 
在其他的shell终端,可以多次执行下面命令进行多次触发。
 
在其他的shell终端,可以多次执行下面命令进行多次触发。
  
<code>v4l2-ctl --set-ctrl <small>soft_trgone=1</small></code>
+
<code>$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>soft_trgone=1</small></code>
  
===== 硬触发模式 =====
+
=====硬触发模式=====
 
下面以使用树莓派GPIO21为模拟触发源,上升沿触发为例。
 
下面以使用树莓派GPIO21为模拟触发源,上升沿触发为例。
  
可以使用[[Mv mipi i2c.sh user guide|mv_mipi_i2c.sh]]脚本进行丰富的触发参数设置。
+
可以使用[[Gx mipi i2c.sh user guide/zh|gx_mipi_i2c.sh]]脚本进行丰富的触发参数设置。
 
 
====== 硬件连接 ======
 
[[File:MV-MIPI-X-RPI B TRIG 01.jpg|center|thumb|800x800px|MV camera hardware trigger connection]]
 
<br />
 
  
====== 设置模式 ======
+
======设置模式======
<code>v4l2-ctl --set-ctrl <small>trigger_mode=1</small></code>
+
<code>$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>work_mode=1</small></code>
  
<code>v4l2-ctl --set-ctrl <small>trigger_src=1</small></code>
+
<code>$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>trigger_src=1</small></code>
  
====== 开始取图 ======
+
======开始取图======
<code>v4l2-ctl --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=GREY --stream-mmap --stream-count=5 --stream-to="y8-${WIDTH}x${HEIGHT}.raw"</code>
+
<code>v4l2-ctl --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=UYVY --stream-mmap --stream-count=5 --stream-to="uyvy-${WIDTH}x${HEIGHT}.yuv"</code>
  
====== 进行硬触发操作 ======
+
======进行硬触发操作======
 
在其他的shell终端,可以多次执行下面命令进行多次触发。
 
在其他的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/raspberrypi_v4l2/tree/main/gx_i2c_tools 链接]。
====CM4的补充说明====
+
====流模式====
cm4支持两路摄像头同时使用,采用上面的步骤安装的dtbo将只能使用CAM1。如需使用两路摄像头,请按如下步骤:
 
  
===== 硬件连接 =====
+
=====设置帧率=====
参考树莓派这个[https://www.raspberrypi.com/documentation/computers/compute-module.html 说明],将J6进行短接。
+
<code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl frame_rate=$FPS</code>  
=====更新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>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=UYVY --stream-mmap --stream-count=-1 --stream-to=/dev/null</code>
  
<code>sudo cp raspberrypi_v4l2/release/driver_bin/$(uname -r)/veye_mvcam-cm4.dtbo /boot/overlays/veye_mvcam.dtbo</code>
+
=====保存图片到文件=====
  
<code>sudo reboot</code>
+
*UYVY格式
=====对于Bullseye系统(kernel5.15+)=====
 
手动编辑<code>/boot/config.txt</code>文件,增加一行<code>dtoverlay=[camera],cam0</code>,如下所示:
 
  
<code>[all]</code>
+
<code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=UYVY --stream-mmap --stream-count=1 --stream-to="y8-${WIDTH}x${HEIGHT}.yuv"</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|树莓派平台上摄像头驱动源码编译指南]]。
 
=== Legacy模式用法 ===
 
 
 
我们在这个[https://github.com/veyeimaging/mvcam_raspberrypi github仓库]中存储legacy模式的代码。
 
 
 
国内用户可以使用[https://gitee.com/veyeimaging/mvcam_raspberrypi gitee仓库]。
 
 
 
==== 下载软件包 ====
 
<code>git clone <nowiki>https://github.com/veyeimaging/mvcam_raspberrypi.git</nowiki></code>
 
 
 
增加可执行权限
 
 
 
<code>chmod +x -R ./mvcam_raspberrypi/</code>
 
 
 
==== 软件包主要内容介绍 ====
 
camera_i2c_config:自动识别不同的树莓派板型,并控制power on 引脚给摄像机供电。
 
 
 
mv_raspicam:实现图像预览、图片保存等功能。
 
 
 
mv_mipi_i2c.sh:通过i2c协议读取和设置相机参数的脚本。
 
 
 
veye_i2c_upgrade:相机固件升级工具。
 
 
 
==== 相机上电 ====
 
<code>./camera_i2c_config</code>
 
 
 
相机上电后,可以执行:
 
 
 
<code>i2cdetect -y 10</code>
 
 
 
出现0x3b的设备,则表明相机已启动,并且i2c通道正常工作。
 
 
 
==== 视频预览 ====
 
<code>./mv_raspicam -t -1 -md 0</code>
 
 
 
其中 -md指明像素数据格式:
 
{| class="wikitable"
 
!-md option
 
!data type
 
|-
 
|0
 
|8bit Y
 
|-
 
|1
 
|10bit Y
 
|-
 
|2
 
|12bit Y
 
|}
 
-roi可以指明需要的roi尺寸。
 
 
 
对于宽度超过1920的尺寸,<code>mv_raspicam</code> 会先将图像缩小一倍,然后进行预览显示。
 
 
 
==== 保存图片 ====
 
<code>./mv_raspicam -t 1000 -md 0 -sr 10 -o /dev/shm/y8-3104x2064_%04d.raw</code>
 
 
 
-sr是存储图片的间隔,这里每间隔10张图片保存一张。
 
 
 
-t 1000,单位是ms,这里表示1秒。
 
 
 
完成后在<code>/dev/shm/</code>目录下会保存下几个文件。
 
 
 
==== 触发模式 ====
 
本章节需要使用mv_mipi_i2c.sh,请参考下面相关[[Mv series camera appnotes 4 rpi/zh#i2c.E5.8F.82.E6.95.B0.E9.85.8D.E7.BD.AE.E6.96.B9.E6.B3.95|i2c参数配置方法章节]]。
 
 
 
===== 软触发 =====
 
 
 
====== 设置模式 ======
 
<code>./mv_mipi_i2c.sh -w -f trgmode -p1 1</code>
 
 
 
<code>./mv_mipi_i2c.sh -w -f trgsrc -p1 0</code>
 
 
 
====== 设置触发属性 ======
 
可以设置触发数量,触发间隔等。下面设置单次触发5张,每张间隔1毫秒。
 
 
 
<code>./mv_mipi_i2c.sh -w -f trgnum -p1 5</code>
 
 
 
<code>./mv_mipi_i2c.sh -w -f trginterval -p1 1000</code>
 
 
 
====== 开始取图 ======
 
<code>./mv_raspicam -t -1 -md 0</code>
 
 
 
====== 进行软触发操作 ======
 
在其他的shell终端,可以多次执行下面命令进行多次触发。
 
 
 
<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]]
 
====== 设置模式 ======
 
本次以普通触发为例
 
 
 
<code>./mv_mipi_i2c.sh -w -f trgmode -p1 1</code>
 
 
 
<code>./mv_mipi_i2c.sh -w -f trgsrc -p1 1</code>
 
 
 
====== 设置触发属性 ======
 
设置触发数量为2张。
 
 
 
<code>./mv_mipi_i2c.sh -w -f trgnum -p1 2</code>
 
 
 
设置上升沿触发
 
 
 
<code>./mv_mipi_i2c.sh -w -f trgedge -p1 0</code>
 
 
 
此外,还可以对硬触发设置丰富的触发属性,如触发延迟、信号过滤等。
 
 
 
====== 开始取图 ======
 
<code>./mv_raspicam -t -1 -md 0</code>
 
 
 
====== 进行硬触发操作 ======
 
<code>python gpio_trigger.py</code>
 
 
 
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))格式都是以这种方式存储的。
+
<code>./yavta -c-1 --skip 0 -f UYVY -s ${WIDTH}x${HEIGHT} /dev/video0</code>
[[File:Packed raw data layer.png|center|thumb|1200x1200px|Packed raw data layer]]
+
====同步模式====
<br />
+
下面的subdev要根据实际情况区分。
===== 紧密排列图片大小 =====
+
=====设置同步模式=====
Buffersize= ALIGN_UP(width*bit_depth/8,32)*ALIGN_UP(height,16)
+
<code>$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl work<small>_mode=4</small></code>
 +
=====设置主从相机=====
 +
主相机:
  
行buffersize需要是32字节的整数倍;列buffersize是16字节的整数倍。
+
<code>$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>sync_role=0</small></code>
  
举例来说,3088*2064@8bit的图像大小是6406656; 3088*2064@10bit的图像大小是7991808;3088*2064@12bit 的图像大小是9576960。
+
从相机:
  
==== 转换工具 ====
+
<code>$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>sync_role=1</small></code>
我们编写了一个小工具:[https://github.com/veyeimaging/pixel_layer_convert pixel_layer_convert],可以很方便的将紧密排列的图片转为具有填充位的图片。
+
=====开始取图=====
 
+
同步模式下的取图方式与视频流模式下完全一致。
比如下面的命令,可以将一个3088宽度的packed raw10 图片转为unpacked raw10。
+
===shell脚本进行参数配置===
 
 
<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]。
 
 
 
==== 树莓派官方对于Packed format和Unpacked format的解释 ====
 
 
 
===== Packed format details =====
 
The packed format uses less storage for pixel data.
 
 
 
''On Raspberry Pi 4 and earlier devices'', the packed format packs pixels using the MIPI CSI-2 standard. This means:
 
 
 
* 10-bit camera modes pack 4 pixels into 5 bytes. The first 4 bytes contain the 8 most significant bits (MSBs) of each pixel, and the final byte contains the 4 pairs of least significant bits (LSBs).
 
* 12-bit camera modes pack 2 pixels into 3 bytes. The first 2 bytes contain the 8 most significant bits (MSBs) of each pixel, and the final byte contains the 4 least significant bits (LSBs) of both pixels.
 
 
 
''On Raspberry Pi 5 and later devices'', the packed format compresses pixel values with a visually lossless compression scheme into 8 bits (1 byte) per pixel.
 
 
 
===== Unpacked format details =====
 
The unpacked format provides pixel values that are much easier to manually manipulate, at the expense of using more storage for pixel data.
 
 
 
On all devices, the unpacked format uses 2 bytes per pixel.
 
 
 
''On Raspberry Pi 4 and earlier devices'', applications apply zero padding at the '''most significant end'''. In the unpacked format, a pixel from a 10-bit camera mode cannot exceed the value 1023.
 
 
 
''On Raspberry Pi 5 and later devices'', applications apply zero padding at the '''least significant end''', so images use the full 16-bit dynamic range of the pixel depth delivered by the sensor.
 
 
 
=== shell脚本进行参数配置 ===
 
 
我们提供了shell脚本来配置参数。
 
我们提供了shell脚本来配置参数。
  
https://github.com/veyeimaging/raspberrypi_v4l2/tree/main/mv_tools_rpi
+
[[Gx mipi i2c.sh user guide/zh|gx_mipi_i2c.sh user guide]]
 
+
===客户集成开发的几点建议===
[[mv_mipi_i2c.sh user guide]]
+
====初始化阶段====
=== 参考资料 ===
+
需要完成分辨率、帧率的配置。建议客户在程序初始化阶段,直接v4l2-ctl命令以及media_setting_rpi5.sh的调用,完成分辨率帧率以及数据格式的配置。
 
 
* [https://www.raspberrypi.com/documentation/computers/getting-started.html 树莓派系统的安装]
 
* [https://www.raspberrypi.com/documentation/accessories/camera.html#libcamera-and-the-legacy-raspicam-camera-stack 树莓派legacy camera stack和libcamera模式的区别]
 
 
 
=== 问题反馈 ===
 
我们致力于为嵌入式平台的图像应用提供更丰富的可能性。因此,我们在嵌入式平台的软件基于开源的原则而进行。
 
 
 
如对我们现有软件有任何的问题、建议,欢迎提交到[http://forum.veye.cc 论坛:],或者给我们的技术人员发邮件xumm#csoneplus.com。
 
 
 
=== 本文修改记录 ===
 
 
 
* 2025-07-02
 
 
 
增加veye_viewer软件的描述。
 
 
 
* 2025-03-23
 
 
 
增加对MV-MIPI-GMAX4002M的支持。
 
 
 
增加mv_probe.sh脚本的使用描述。
 
 
 
去掉使用gstreamer预览UYVY格式的描述。
 
 
 
*2024-07-08
 
 
 
增加对RAW-MIPI-SC535M的支持。
 
 
 
* 2024-01-01
 
 
 
增加对树莓派5的相关说明。
 
 
 
*2023-08-16
 
 
 
增加对RAW-MIPI-IMX462M和RAW-MIPI-AR0234M的支持。
 
 
 
* 2023-06-07
 
 
 
增加使用qv4l2和VLC预览画面的方法。
 
 
 
* 2023-04-14
 
 
 
配合新版本驱动,去掉了翻转操作,增加了一种roi配置方法。
 
 
 
* 2023-03-29
 
 
 
增加opencv sample。
 
 
 
*2023-03-26
 
 
 
增加MV-MIPI-IMX287M的支持。
 
 
 
*2023-03-04
 
 
 
增加Bullseye系统中CM4的相关说明。
 
 
 
* 2023-02-10
 
 
 
V4L2模式下增加了CM4的说明。
 
 
 
*2022-12-08
 
 
 
增加了MV-MIPI-IMX264M的支持。
 
  
* 2022-11-02
+
不要使用gx_mipi_i2c.sh直接设置相机寄存器,因为直接设置相机寄存器的话,树莓派的linux驱动层次并不能同步到设置值。
 +
====工作阶段====
 +
客户根据自己开发语言的不同,可以参考本文前述的代码、工具。
  
增加了IMX265和SC132新型号的支持。
+
关于时间戳,v4l2_buffer.timestamp会带有树莓派芯片接收到一个完整数据帧的准确时间,可以用于做相机同步或者与其他外部传感器同步的参考时间戳。
 +
====参数配置====
 +
GX系列相机的参数非常丰富和灵活,主要使用gx_mipi_i2c.sh直接进行寄存器配置的方式实现。具体请参考寄存器文档和gx_mipi_i2c.sh的说明文档。
  
* 2022-05-16
+
gx_mipi_i2c.sh具有paramsave功能,作用是将客户所有的配置参数保存的相机flash中,但是不建议客户在程序中频繁调用。
  
提供了图片格式转换工具。
+
===本文修改记录===
  
* 2022-04-14
+
*2025-12-06
  
 
第一个版本
 
第一个版本

Latest revision as of 14:15, 30 December 2025

English

1 概述

GX系列相机是为嵌入式的AI应用推出的相机,具备卓越的ISP性能,多种工作模式,丰富的功能选项,可靠的稳定性设计。其使用MIPI CSI-2接口,尤其适合嵌入式运算平台使用。

本文介绍了如何在树莓派平台使用GX系列相机。

1.1 支持的模组

系列 型号 状态
GX系列 GX-MIPI-IMX662 完成

2 硬件准备及安装

GX系列相机使用树莓派兼容的22pin接口,但是需要独立的5V DC供电。

2.1 GX系列摄像头与22pin接口树莓派连接方式


GX Camera to RaspberryPi5


2.2 GX系列相机与 15pin接口的树莓派之间的连接方式


GX Camera to RaspberryPi4
GX Camera to RaspberryPi4


3 驱动安装及验证

我们在这个github仓库保存了驱动代码,i2c工具集,配置脚本等内容。

国内用户可以使用gitee仓库

3.1 下载驱动包

wget https://github.com/veyeimaging/raspberrypi_v4l2/releases/latest/download/raspberrypi_v4l2.tgz

国内用户可通过gitee下载:

https://gitee.com/veyeimaging/raspberrypi_v4l2/releases/

3.2 安装驱动

tar -xzvf raspberrypi_v4l2.tgz

cd raspberrypi_v4l2/release/

chmod +x *

  • 对于树莓派5

sudo ./install_driver_rpi5.sh veye_gxcam

会在/boot/config.txt中安装CAM1和CAM0两个dtvoerlay。

  • 其他树莓派

sudo ./install_driver.sh veye_gxcam

然后重启树莓派。

备注:如果提示无法找到对应版本的驱动,说明我们没有提供对应您的piOS版本编译后的驱动程序。请尝试从源码编译。

3.3 卸载驱动

如需更换成其他摄像头模组型号的驱动,必须要先卸载现在的驱动。

sudo ./uninstall_driver.sh veye_gxcam

3.4 系统状态验证

以GX-MIPI-IMX662为例:

dmesg | grep gxcam

可以看到linux启动阶段probe到的相机型号:

camera is: GX-MIPI-IMX662

并且/dev/video0 节点存在,证明摄像头状态正常。

4 状态检测并配置环境变量

这里,我们提供了一个gx_probe.sh脚本,用于自动检测识别到的相机并将相机默认的型号、宽、高、帧率等信息配置到环境变量中。

使用方法是:

$ source ./gx_probe.sh i2c_bus

一个典型的输出如下:

$ source ./gx_probe.sh 10

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

Found veye_gxcam camera on i2c-10.

Setenv CAMERAMODEL = GX-MIPI-IMX662

Setenv FPS = 60

Setenv WIDTH = 1920

Setenv HEIGHT = 1080

可以通过 echo $CAMERAMODEL来验证环境变量的输出结果。注意,此环境变量只对当前会话有效。

5 树莓派5的配置

在树莓派5上,驱动程序现在使用media control API,我们必须先正确设置media graph。这包括正确设置media pad的格式并正确链接它们。

我们提供了一系列脚本实现这个功能,保存在rpi5_scripts目录。

  • ./find_entity.sh

$ ./find_entity.sh

This is a Raspberry Pi 5.

Kernel version is 6.12.47, use i2c-10 for CAM0 and i2c-11 for CAM1.

Found gxcam @ i2c-10 entity on /dev/media3

Plese get frame from /dev/video0 and use /dev/v4l-subdev2 for camera setting.

树莓派5重启之后,相机的media node,video node可能发生变化,因此,建议执行后续操作前执行./find_entity.sh以明确设备节点。

上述提示信息中,可以看到系统插入了两个相机,以及每个相机的对应的设备节点。

i2c-10对应板子上的CAM0插口,i2c-11对应板子上的CAM1插口。

  • media_setting_rpi5.sh

$ ./media_setting_rpi5.sh

This is a Raspberry Pi 5.

Kernel version is 6.12.47, do not support unpacked format.

Kernel version is 6.12.47, use i2c-10 for CAM0 and i2c-11 for CAM1.

Usage: ./media_setting_rpi5.sh veyecam2m/csimx307/cssc132/mvcam/gxcam -fmt [UYVY/RAW8/RAW10/RAW12] -x [roi_x] -y [roi_y] -w [width] -h [height] -c [cam 0|1]

This shell script is designed to detect the connection of a camera on Raspberry Pi 5.

    It utilizes media-ctl and v4l2-ctl commands to configure the linking relationships and data formats of the media pad.

    Once completed, you can directly use /dev/video0 or /dev/video8 to obtain image data.

在进行后续操作前,必须执行此脚本以完成参数的配置。

举例来说,对于接到CAM0口的GX-MIPI-IMX662:

./media_setting_rpi5.sh gxcam -fmt UYVY -x 0 -y 0 -w 1920 -h 1080 -c 0

6 实时预览

6.1 使用veye_viewer播放图像

veye_viewer是一个基于QT的开源的客户端软件,可以方便客户进行相机评测、参数配置。另外其操作日志、寄存器清单以及开源的特性,方便客户进行参考,二次开发。

可通过veye_viewer下载源码,或在其发行版中直接下载对应平台的可执行程序。

国内用户可访问gitee仓库

6.2 使用qv4l2播放图像

首先安装qv4l2

sudo apt install qv4l2

注:对于树莓派5,需要在执行qv4l2播放图像前先执行前面所述media_setting_rpi5.sh脚本,以进行准备工作。

1. 在命令行中输入qv4l2以启动 V4L2 播放器。

2. 点击 ▶(播放)按钮以调出打开的媒体窗口。


Play gx camera using qv4l2 on RPI


7 Gstreamer应用范例

export DISPLAY=:0

7.1 安装gstreamer

sudo apt-get install gstreamer1.0-tools

sudo apt-get install libx264-dev libjpeg-dev

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

7.2 使用gstreamer

通过gstreamer中的脚本,可实现图像预览,图片抓拍,h264视频编码保存成mp4/mkv格式等功能。

7.3 网络传输 TCP streaming

树莓派(Server)一侧执行

gst-launch-1.0 -v v4l2src device=/dev/video0 num-buffers=-1 ! "video/x-raw,format=(string)UYVY, width=(int)1920, height=(int)1080,framerate=(fraction)30/1" ! v4l2h264enc extra-controls="controls, h264_profile=4, video_bitrate=4000000" ! 'video/x-h264, profile=high, level=(string)4' ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink  host=x.x.x.x port=5000

码流带宽为4Mbps,持续传输,监听端口为5000。

Client一侧执行

gst-launch-1.0 -v tcpclientsrc host=x.x.x.x port=5000 ! gdpdepay ! rtph264depay ! avdec_h264 ! autovideosink sync=false

其中x.x.x.x为树莓派(Server)的IP地址。

Client一侧,如为windows系统,建议使用powershell。gstreamer的windows版本下载地址。只安装runtime files即可。

8 yavta 应用范例

8.1 下载并编译yavta

git clone git://git.ideasonboard.org/yavta.git

$ cd yavta;make

8.2 yavta 例程

./yavta -c1 -F"y8-${WIDTH}x${HEIGHT}.yuv" --skip 0 -f UYVY -s "${WIDTH}x${HEIGHT}" /dev/video0

$ ./yavta -c1 -Fuyvy_1920X1080.yuv --skip 0 -f UYVY -s 1920x1080 /dev/video0

9 使用opencv获取图片

9.1 使用opencv预览UYVY格式图像

  • install opencv

$ sudo apt install python3-opencv

  • 为了将摄像头数据从v4l2设备导入到opencv,我们提供了几个sample

$ python ./v4l2_opencv_show2.py --width 1920 --height 1080 --fps 30

对于树莓派5,需要增加一个--ctldev /dev/v4l-subdev*参数用于指明配置参数的subdev。

10 v4l2-ctl 应用范例

10.1 安装v4l2-utils

$ sudo apt-get install v4l-utils

10.2 v4l2-ctl例程

  • 抓拍一张UYVY原始数据图片 (1080p mode)

v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=UYVY --stream-mmap --stream-count=1 --stream-to=uyvy-1920x1080.yuv

  • 抓拍10张UYVY原始数据图片 (1080p mode)

v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=UYVY --stream-mmap --stream-count=10 --stream-to=uyvy-1920x1080_stream.yuv

10.3 列出相机支持的数据格式

v4l2-ctl --list-formats-ext

ioctl: VIDIOC_ENUM_FMT

        Type: Video Capture

        [0]: 'UYVY' (UYVY 4:2:2)

                Size: Discrete 1920x1080

        [1]: 'YUYV' (YUYV 4:2:2)

注:对于树莓派5,实际支持的图像格式取决于相机能力,而不是此处的列表。

10.4 使用v4l2-ctl配置参数

v4l2-ctl -d /dev/v4l-subdev2 -L

User Controls

                   work_mode 0x00981a01 (int)    : min=0 max=4 step=1 default=0 value=0 flags=volatile, execute-on-write

                    trigger_src 0x00981a02 (int)    : min=0 max=1 step=1 default=1 value=1 flags=volatile, execute-on-write

                    soft_trgone 0x00981a03 (button) : value=0 flags=write-only, execute-on-write

                      sync_role 0x00981a04 (int)    : min=0 max=1 step=1 default=0 value=0 flags=volatile, execute-on-write

                     frame_rate 0x00981a05 (int)    : min=0 max=60 step=1 default=60 value=60 flags=volatile, execute-on-write

可以使用下面的方法设置和获取参数。

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl [ctrl_type]=[val]

v4l2-ctl -d /dev/v4l-subdev2 --get-ctrl [ctrl_type]

注:对于树莓派5,本节的所有使用v4l2-ctl配置参数的命令需要增加 -d参数来指明配置参数使用的subdev。

比如执行./media_setting_rpi5.sh或者./find_entity.sh的时候提示使用/dev/v4l-subdev2进行参数配置。

v4l2-ctl -L需要变更为v4l2-ctl -L -d /dev/v4l-subdev2

注:以上所有功能,均可使用gx_mipi_i2c.sh实现。

需要指出的是,以上参数在开始取图的状态均不可修改。下面进行逐个说明:

10.4.1 配置触发模式

$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl work_mode=[0-2]

0:流模式

1:普通触发模式

4:多相机同步模式

10.4.2 配置触发源

$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl trigger_src=[0-1]

0: 软触发

1: 硬触发

10.4.3 软触发一次

$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl soft_trgone=1

10.4.4 设置帧率

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl frame_rate=[1-max]

随分辨率的调整,最大帧率会自动更新。

10.5 触发模式

10.5.1 软触发模式
10.5.1.1 设置模式

$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl work_mode=1

$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl trigger_src=0

10.5.1.2 开始取图

v4l2-ctl --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=UYVY --stream-mmap --stream-count=5 --stream-to="uyvy-${WIDTH}x${HEIGHT}.yuv"

10.5.1.3 进行软触发操作

在其他的shell终端,可以多次执行下面命令进行多次触发。

$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl soft_trgone=1

10.5.2 硬触发模式

下面以使用树莓派GPIO21为模拟触发源,上升沿触发为例。

可以使用gx_mipi_i2c.sh脚本进行丰富的触发参数设置。

10.5.2.1 设置模式

$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl work_mode=1

$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl trigger_src=1

10.5.2.2 开始取图

v4l2-ctl --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=UYVY --stream-mmap --stream-count=5 --stream-to="uyvy-${WIDTH}x${HEIGHT}.yuv"

10.5.2.3 进行硬触发操作

在其他的shell终端,可以多次执行下面命令进行多次触发。

$ python gpio_trigger.py

Note:触发脚本链接

10.6 流模式

10.6.1 设置帧率

v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl frame_rate=$FPS

10.6.2 可使用如下命令进行帧率统计

v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=UYVY --stream-mmap --stream-count=-1 --stream-to=/dev/null

10.6.3 保存图片到文件
  • UYVY格式

v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=UYVY --stream-mmap --stream-count=1 --stream-to="y8-${WIDTH}x${HEIGHT}.yuv"

或者

./yavta -c-1 --skip 0 -f UYVY -s ${WIDTH}x${HEIGHT} /dev/video0

10.7 同步模式

下面的subdev要根据实际情况区分。

10.7.1 设置同步模式

$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl work_mode=4

10.7.2 设置主从相机

主相机:

$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl sync_role=0

从相机:

$ v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl sync_role=1

10.7.3 开始取图

同步模式下的取图方式与视频流模式下完全一致。

11 shell脚本进行参数配置

我们提供了shell脚本来配置参数。

gx_mipi_i2c.sh user guide

12 客户集成开发的几点建议

12.1 初始化阶段

需要完成分辨率、帧率的配置。建议客户在程序初始化阶段,直接v4l2-ctl命令以及media_setting_rpi5.sh的调用,完成分辨率帧率以及数据格式的配置。

不要使用gx_mipi_i2c.sh直接设置相机寄存器,因为直接设置相机寄存器的话,树莓派的linux驱动层次并不能同步到设置值。

12.2 工作阶段

客户根据自己开发语言的不同,可以参考本文前述的代码、工具。

关于时间戳,v4l2_buffer.timestamp会带有树莓派芯片接收到一个完整数据帧的准确时间,可以用于做相机同步或者与其他外部传感器同步的参考时间戳。

12.3 参数配置

GX系列相机的参数非常丰富和灵活,主要使用gx_mipi_i2c.sh直接进行寄存器配置的方式实现。具体请参考寄存器文档和gx_mipi_i2c.sh的说明文档。

gx_mipi_i2c.sh具有paramsave功能,作用是将客户所有的配置参数保存的相机flash中,但是不建议客户在程序中频繁调用。

13 本文修改记录

  • 2025-12-06

第一个版本