|
|
| Line 76: |
Line 76: |
| | 完成系统安装后,系统上电。在Firefly板端执行以下命令来检测是否正确连接相机。 | | 完成系统安装后,系统上电。在Firefly板端执行以下命令来检测是否正确连接相机。 |
| | | | |
| − | <code>dmesg | grep gxcam</code> | + | <code>$ dmesg | grep gxcam</code> |
| | | | |
| | 应当有类似下面的提示: | | 应当有类似下面的提示: |
| | | | |
| − | [ 6.667547] gxcam 7-003b: veye gx series camera driver version: 01.00.01 | + | <code>[ 6.667547] gxcam 7-003b: veye gx series camera driver version: 01.00.01</code> |
| | | | |
| − | [ 6.781681] gxcam 7-003b: camera is: GX-MIPI-IMX662 | + | <code>[ 6.781681] gxcam 7-003b: camera is: GX-MIPI-IMX662</code> |
| | | | |
| − | [ 6.820210] gxcam 7-003b: Success to get gxcam endpoint data lanes, dts uses 2 lanes,will set to camera | + | <code>[ 6.820210] gxcam 7-003b: Success to get gxcam endpoint data lanes, dts uses 2 lanes,will set to camera</code> |
| | | | |
| − | [ 6.834597] gxcam 7-003b: gxcam_enum_controls success | + | <code>[ 6.834597] gxcam 7-003b: gxcam_enum_controls success</code> |
| | | | |
| − | [ 6.891209] rockchip-csi2-dphy csi2-dphy0: dphy0 matches m00_b_gxcam 7-003b:bus type 5 | + | <code>[ 6.891209] rockchip-csi2-dphy csi2-dphy0: dphy0 matches m00_b_gxcam 7-003b:bus type 5</code> |
| | | | |
| | 可以看到识别到当前的摄像机模组的型号,版本号。 | | 可以看到识别到当前的摄像机模组的型号,版本号。 |
| Line 105: |
Line 105: |
| | | | |
| | 正确识别摄像头之后,相机被识别为/dev/video0。 | | 正确识别摄像头之后,相机被识别为/dev/video0。 |
| − | ====状态检测并配置环境变量====
| |
| − | 在[https://github.com/veyeimaging/rk35xx_veye_bsp/tree/main/gx_tools 这里],我们提供了两个脚本,可以自动检索下相机的一些信息
| |
| | | | |
| − | 首先试用 probe_camera_info-rk.sh脚本,该脚本用于探测已连接并成功注册的摄像头设备,检索设备对应的媒体设备节点、视频设备节点、子设备节点、I²C 总线及设备标识等底层信息。执行后,将在当前目录生成 <code>auto_camera_index.json</code> 文件并在文件中记录检索到的信息。
| + | === 相机应用开发指南 === |
| | + | [https://wiki.veye.cc/index.php/GX_Camera_Application_Development_Guide/zh 开发指南] |
| | | | |
| − | ./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_gxcam 7-003b",
| |
| − |
| |
| − | "i2c_bus": "7"
| |
| − |
| |
| − | }
| |
| − |
| |
| − | ]
| |
| − |
| |
| − | 通过索引信息,我们可以看到"i2c_bus": "7"对应的i2c_bus信息,以及接入了多少台设备,当前索引显示只接入一台设备,并且i2c_bus号是7,如果接入多个设备,索引信息可能会有"i2c_bus": "10","i2c_bus": "11"等信息
| |
| − |
| |
| − | 然后使用<code>gx_probe.sh</code>脚本,如果是多路相机,可以根据上一个脚本读出的i2c_bus执行,并将对应的相机型号、宽、高、帧率等信息配置到环境变量中。
| |
| − |
| |
| − | 使用方法是:
| |
| − |
| |
| − | <code>source ./gx_probe.sh 7</code>
| |
| − |
| |
| − | 一个典型的输出如下:
| |
| − |
| |
| − | <code>$ source ./gx_probe.sh 7</code>
| |
| − |
| |
| − | <code>Found veye_gxcam camera on i2c-7.</code>
| |
| − |
| |
| − | <code>Setenv CAMERAMODEL = GX-MIPI-IMX662</code>
| |
| − |
| |
| − | <code>Setenv FPS = 60</code>
| |
| − |
| |
| − | <code>Setenv WIDTH = 1920</code>
| |
| − |
| |
| − | <code>Setenv HEIGHT = 1080</code>
| |
| − |
| |
| − | 可以通过 <code>echo $CAMERAMODEL</code>来验证环境变量的输出结果。注意,此环境变量只对当前会话有效。
| |
| − |
| |
| − | ====配置命令行全局变量 ====
| |
| − | 根据主板型号,配置I2C_BUS全局变量。
| |
| − |
| |
| − | * ROC-RK3588S-PC
| |
| − |
| |
| − | <code>export I2C_BUS=7</code>
| |
| − |
| |
| − | * ROC-RK3566-PC and ROC-RK3576-PC
| |
| − |
| |
| − | <code>export I2C_BUS=4</code>
| |
| − | ==== 使用media-ctl查看拓扑结构 ====
| |
| − | 使用media-ctl指令,可以清晰的展现出当前的拓扑结构。
| |
| − |
| |
| − | <code>media-ctl -p -d /dev/media0</code>
| |
| − |
| |
| − | ===== 链接关系 =====
| |
| − | gx camera->rockchip-csi2-dphy0->rockchip-mipi-csi2->stream_cif_mipi_id0 - - ->DDR(/dev/video0)
| |
| − |
| |
| − | 应用程序可以通过/dev/video0节点获取图像。
| |
| − |
| |
| − | ===== gx camera entity信息 =====
| |
| − | 以GX-MIPI-IMX662为例:
| |
| − |
| |
| − | - entity 63: m00_b_gxcam 7-003b (1 pad, 1 link)
| |
| − |
| |
| − | type V4L2 subdev subtype Sensor flags 0
| |
| − |
| |
| − | device node name /dev/v4l-subdev2
| |
| − |
| |
| − | pad0: Source
| |
| − |
| |
| − | [fmt:UYVY8_2X8/1920x1080@10000/600000 field:none colorspace:rec709
| |
| − |
| |
| − | crop:(0,0)/1920x1080]
| |
| − |
| |
| − | -> "rockchip-csi2-dphy0":0 [ENABLED]
| |
| − |
| |
| − | 可以看到:
| |
| − |
| |
| − | * 该Entity完整的名称是: <code>m00_b_gxcam 7-003b</code>。(在ROC-RK3566-PC上该Entity名称是<code>m00_b_gxcam 4-003b</code>)
| |
| − | * 它是一个 V4L2 subdev (Sub-Device) Sensor。
| |
| − | * 它对应的节点是 <code>/dev/v4l-subdev2</code> ,应用程序(如<code>v4l2-ctl</code>)可以打开它,并进行配置。
| |
| − | * 它的输出格式是 [<code>UYVY8_2X8/1920x1080@10000/600000 field:none</code>] ,其中<code>UYVY8_2X8</code>是一种mbus-code的简写,下一小节会列出支持的mbus-code。
| |
| − | * 当前分辨率是<code>1920x1080。</code>
| |
| − | * 当前帧间隔是<code>10000/600000</code>,即帧率是60。
| |
| − |
| |
| − | 摄像机输出的数据格式,可以通过media-ctl指令修改。
| |
| − |
| |
| − | <br />
| |
| − | ==== 相机支持的mbus-code ====
| |
| − | GX系列相机使用UYVY数据格式能力,具体请参考每个型号的相机的数据手册。
| |
| − | {| class="wikitable"
| |
| − | |+格式对应关系
| |
| − | !Format on datasheet
| |
| − | !mbus-code for media-ctl
| |
| − | !FourCC pixelformat for v4l2-ctl
| |
| − | |-
| |
| − | |UYVY
| |
| − | |UYVY8_2X8
| |
| − | |UYVY
| |
| − | |}
| |
| − |
| |
| − | === veye_viewe工具 ===
| |
| − | 可通过[https://gitee.com/veyeimaging/veye_viewer veye_viewe]下载
| |
| − |
| |
| − | 我们可以使用该工具对相机进行一些参数配置(对寄存器直接操作更改参数),模式更换(流模式,触发模式,同步模式),查看相机的一些基本信息(分辨率,帧率等)
| |
| − |
| |
| − | === 应用范例 ===
| |
| − | ==== 使用v4l2-ctl配置参数 ====
| |
| − | <code>$ v4l2-ctl -d /dev/v4l-subdev2 -L</code>
| |
| − |
| |
| − | <code>User Controls</code>
| |
| − |
| |
| − | <code> trigger_mode 0x00981a01 (int) : min=0 max=4 step=1 default=0 value=0 flags=volatile, execute-on-write</code>
| |
| − |
| |
| − | <code> trigger_src 0x00981a02 (int) : min=0 max=1 step=1 default=1 value=1 flags=volatile, execute-on-write</code>
| |
| − |
| |
| − | <code> soft_trgone 0x00981a03 (button) : value=0 flags=write-only, execute-on-write</code>
| |
| − |
| |
| − | <code> sync_role 0x00981a04 (int) : min=0 max=1 step=1 default=0 value=0 flags=volatile, execute-on-write</code>
| |
| − |
| |
| − | <code> frame_rate 0x00981a05 (int) : min=0 max=60 step=1 default=60 value=60 flags=volatile, execute-on-write</code>
| |
| − |
| |
| − | 可以使用下面的方法设置和获取参数。
| |
| − |
| |
| − | <code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl [ctrl_type]=[val]</code>
| |
| − |
| |
| − | <code>v4l2-ctl -d /dev/v4l-subdev2 --get-ctrl [ctrl_type]</code>
| |
| − |
| |
| − | 以上所有功能,均可使用[https://wiki.veye.cc/index.php/Gx_mipi_i2c.sh_user_guide gx_mipi_i2c.sh]实现。
| |
| − |
| |
| − | 需要指出的是,以上参数在取图过程中均不可修改。下面进行逐个说明:
| |
| − |
| |
| − | =====配置触发模式=====
| |
| − | <code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>trigger_mode=[0-2]</small></code>
| |
| − |
| |
| − | 0:流模式
| |
| − |
| |
| − | 1:普通触发模式
| |
| − |
| |
| − | 4:多相机同步模式
| |
| − | =====配置触发源=====
| |
| − | <code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>trigger_src=[0-1]</small></code>
| |
| − |
| |
| − | 0: 软触发
| |
| − |
| |
| − | 1: 硬触发
| |
| − | =====软触发一次=====
| |
| − | <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>
| |
| − |
| |
| − | 随分辨率的调整,最大帧率会自动更新。
| |
| − |
| |
| − | ==== 使用media-ctl配置图像格式 ====
| |
| − | 可以通过下面的命令,配置摄像机的数据格式,分辨率,帧率。
| |
| − |
| |
| − | <code>media-ctl -d /dev/media0 --set-v4l2 '"m00_b_gxcam '"$I2C_BUS"'-003b":0[fmt:UYVY8_2X8/'"$WIDTH"'x'"$HEIGHT"'@1/'"$FPS"']'</code>
| |
| − |
| |
| − | 其中:<code>"m00_b_gxcam 7-003b"</code>指的相机的<code>entity</code>完整名称,<code>UYVY8_2X8</code>为<code>mbus-code</code>,<code>'"$WIDTH"'x'"$HEIGHT"'</code>指明了分辨率,<code>1/'"$FPS"'</code>指明了帧率。
| |
| − |
| |
| − | 比如,对于GX-MIPI-IMX662,这个命令经过变量替换后的结果是:
| |
| − |
| |
| − | <code>media-ctl -d /dev/media0 --set-v4l2 '"m00_b_gxcam 7-003b":0[fmt:UYVY8_2X8/1920x1080@1/60 field:none]'</code>
| |
| − |
| |
| − | 不仅可以在一个命令中同时配置数据格式,分辨率,帧率,也可以单独修改某一项或某几项。
| |
| − |
| |
| − | ==== 流模式 ====
| |
| − |
| |
| − | ===== 设置数据格式,分辨率,帧率 =====
| |
| − | <code>media-ctl -d /dev/media0 --set-v4l2 '"m00_b_gxcam '"$I2C_BUS"'-003b":0[fmt:UYVY8_2X8/'"$WIDTH"'x'"$HEIGHT"'@1/'"$FPS"']'</code>
| |
| − |
| |
| − | ===== 帧率统计 =====
| |
| − | <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>./yavta -c-1 --skip 0 -f UYVY -s ${WIDTH}x${HEIGHT} /dev/video0</code>
| |
| − |
| |
| − | ===== 保存图片到文件 =====
| |
| − |
| |
| − | * UYVY格式
| |
| − |
| |
| − | v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=UYVY --stream-mmap --stream-count=1 --stream-to=uyvy-${WIDTH}x${HEIGHT}.yuv
| |
| − |
| |
| − | 图片格式请参考前面章节的描述。
| |
| − |
| |
| − | =====yavta应用范例=====
| |
| − |
| |
| − | ====== yavta安装 ======
| |
| − | <code>git clone <nowiki>git://git.ideasonboard.org/yavta.git</nowiki></code>
| |
| − |
| |
| − | <code>cd yavta;make</code>
| |
| − |
| |
| − | ====== 保存图片到文件 ======
| |
| − | 配置完数据格式,分辨率,帧率之后,执行:
| |
| − |
| |
| − | <code>./yavta -c1 -Fuyvy-${WIDTH}x${HEIGHT}.yuv --skip 0 -f UYVY -s ${WIDTH}x${HEIGHT} /dev/video0</code>
| |
| − |
| |
| − | ===== 将相机数据导入OpenCV的范例 =====
| |
| − | <code>sudo apt install python3-opencv</code>
| |
| − |
| |
| − | 详见github上的[https://github.com/veyeimaging/rk35xx_veye_bsp/tree/main/samples samples]目录。
| |
| − |
| |
| − | python3 ./v4l2_opencv_show2.py --width 1920 --height 1080 --fps 60 --i2c 7
| |
| − |
| |
| − | 注意需要使用合适的参数来执行上述程序。
| |
| − |
| |
| − | ===== gstreamer应用范例 =====
| |
| − | 我们提供了几个gstreamer例程,实现了预览功能。详见github上的[https://github.com/veyeimaging/rk35xx_veye_bsp/tree/main/samples samples]目录。
| |
| − |
| |
| − | ===== veye_viewer工具取图 =====
| |
| − | <br />
| |
| − | ==== 触发模式 ====
| |
| − |
| |
| − | ===== 设置数据格式,分辨率,帧率 =====
| |
| − | <code>media-ctl -d /dev/media0 --set-v4l2 '"m00_b_gxcam '"$I2C_BUS"'-003b":0[fmt:UYVY8_2X8/'"$WIDTH"'x'"$HEIGHT"'@1/'"$FPS"']'</code>
| |
| − |
| |
| − | 例:media-ctl -d /dev/media0 --set-v4l2 '"m00_b_gxcam 7-003b":0[fmt:UYVY8_2X8/1920x1080@1/60]'
| |
| − | =====软触发模式=====
| |
| − | ======设置模式======
| |
| − | <code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>trigger_mode=1</small></code>
| |
| − |
| |
| − | <code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>trigger_src=0</small></code>
| |
| − | ======开始取图======
| |
| − | <code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=UYVY --stream-mmap --stream-count=1 --stream-to=uyvy-${WIDTH}x${HEIGHT}.yuv</code>
| |
| − | ======进行软触发操作======
| |
| − | 在其他的shell终端,可以多次执行下面命令进行多次触发。
| |
| − |
| |
| − | <code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>soft_trgone=1</small></code>
| |
| − | =====硬触发模式=====
| |
| − | ======设置模式======
| |
| − | <code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>trigger_mode=1</small></code>
| |
| − |
| |
| − | <code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>trigger_src=1</small></code>
| |
| − |
| |
| − | 可以使用[[Gx mipi i2c.sh user guide|gx_mipi_i2c.sh]]脚本进行丰富的触发参数设置。
| |
| − | ======开始取图======
| |
| − | <code>v4l2-ctl -d /dev/video0 --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=UYVY --stream-mmap --stream-count=1 --stream-to=uyvy-${WIDTH}x${HEIGHT}.yuv</code>
| |
| − | ======进行硬触发操作======
| |
| − | 将合适的触发信号连接到摄像机的trigger引脚并进行触发。
| |
| − |
| |
| − | ==== 同步模式 ====
| |
| − |
| |
| − | ===== 设置数据格式,分辨率,帧率 =====
| |
| − | <code>media-ctl -d /dev/media0 --set-v4l2 '"m00_b_gxcam '"$I2C_BUS"'-003b":0[fmt:UYVY8_2X8/'"$WIDTH"'x'"$HEIGHT"'@1/'"$FPS"']'</code>
| |
| − |
| |
| − | ===== 设置同步模式 =====
| |
| − | 注:rk平台只支持接一路相机,在两个主板终端都执行以下操作,切换到同步模式
| |
| − |
| |
| − | <code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>trigger_mode=4</small></code>
| |
| − |
| |
| − | ===== 设置主从相机 =====
| |
| − | 主相机:
| |
| − |
| |
| − | <code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>sync_role=0</small></code>
| |
| − |
| |
| − | 从相机:
| |
| − |
| |
| − | <code>v4l2-ctl -d /dev/v4l-subdev2 --set-ctrl <small>sync_role=1</small></code>
| |
| − |
| |
| − | ===== 开始取图 =====
| |
| − | 可采用流模式中的几种方式取图
| |
| − | === i2c脚本使用说明 ===
| |
| − | 我们提供了shell脚本来配置参数。
| |
| − |
| |
| − | [[gx_mipi_i2c.sh user guide]]
| |
| | === 参考资料 === | | === 参考资料 === |
| | | | |