GX series camera appnotes 4 jetson/zh

From wiki_veye
Revision as of 15:19, 16 December 2025 by Xumm (talk | contribs) (→‎硬件连接)
Jump to navigation Jump to search

English

1 概述

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

本文介绍了如何在英伟达Jetson平台使用GX系列相机。

1.1 支持的摄像机模组

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

1.2 支持的Jetson Board

Jetson型号 状态
XAVIER NX 完成
Orin NX 完成
Orin Nano 完成

1.3 支持的L4T版本

  • Jetpack5.1.4,L4T版本r35.6
  • Jetpack6.2.1,L4T版本r36.4.4
1.3.1 怎样查看当前L4T版本

在jetson板子上,查看当前L4T版本,尽量使用同一版本进行替换。

cat /etc/nv_tegra_release

如显示:

# R32 (release), REVISION: 7.1......

则表示当前L4T版本为32.7.1,对应的Jetpack版本是Jetpack32.6.1。

2 硬件准备以及安装

GX系列相机需要转接板才可以接入Jetson平台。支持情况如下表:

Camera型号 Jetson型号 FFC线 摄像机数量 额外供电
GX系列 XAVIER NX 15pin转22pin同面FFC 2 5V DC(必须)
Orin Nano

Orin NX

22pin异面FFC 2 5V DC(必须)


2.1 GX相机接到Xavier NX

TBD

2.2 GX相机接到Orin Nano或者Orin NX

TBD

3 更新Jetson系统

本章节描述怎样更新Jetson的L4T系统以支持GX摄像头模组。操作系统更新方法,请参考更新Jetson操作系统

特别的,如果需要外触发功能,需要对Jetson原本的内核打一个补丁——veye_mv_l4t_<verion>.patch。

这个patch具备两个功能:

  1. 增加了黑白相机的Y10和Y12两种数据格式的支持。
  2. 增加了trigger模式的支持。

4 Trigger模式的支持

Jetson系统的默认驱动只支持视频流模式。在其VI驱动中,数据接收功能具有超时机制。我们增加了一个可设的vi_time_out_disable选项,可以动态打开和关闭这个超时机制。

具体应用参考下面的应用范例。

5 系统状态检测

完成系统更新后,重启Jetson主板。

Jetson系统启动过程中,会检测所有i2c bus上摄像头是否存在,如果存在则生成/dev/videoX设备节点。

在Jetson板端执行以下命令来检测是否正确连接摄像头。

dmesg | grep gxcam

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

比如下面这个提示,表示在i2c-10总线上检测到了GX-MIPI-IMX662摄像机。

gxcam 10-003b: camera is: GX-MIPI-IMX662

5.1 /dev/videoX设备节点

摄像头模组在Jetson系统中映射为/dev/videoX设备节点。

操作系统启动过程中,按照i2c bus从小到大的顺序探测摄像头。X值是按照探测的逻辑顺序从0开始递增的。

举例说,如果只接入一个摄像头,无论硬件连接到哪个位置,X都为0。如果接入5个,则按照i2c bus从小到大,X为[0-4]。

v4l2-ctl命令中,使用-d /dev/videoX来访问不同的摄像头。

gstreamer中,v4l2src可以通过指明device=/dev/videoX来访问不同的摄像头。


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

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

6.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_gxcam 10-003b",

    "i2c_bus": "10"

  }

]

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

摄像头信息解释如下:

摄像头信息
代称 名称 作用 何处使用
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文件中的信息进行替换。

6.2 gx_probe.sh

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

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

使用方法是:

$ source ./gx_probe.sh i2c_bus

一个典型的输出如下:

$ source ./gx_probe.sh 10

Found veye_gxcam camera on i2c-10.

Setenv I2C_BUS = 10

Setenv CAMERAMODEL = GX-MIPI-IMX662

Setenv FPS = 60

Setenv WIDTH = 1920

Setenv HEIGHT = 1080

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

7 实时预览

7.1 veye_viewer

veye_viewer是一个开源的,基于QT5的客户端软件。

代码以及使用请参考:https://github.com/veyeimaging/veye_viewer

国内用户可访问gitee仓库

7.2 使用qv4l2预览画面

首先安装qv4l2

sudo apt install qv4l2

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

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

Play mv camera using qv4l2


7.3 使用VLC预览画面

Install vlc,

sudo apt-get install vlc

1. Open VLC with command line vlc , or click the icon to launch.

2. Hit the (Play) button to call the open media window.

3. In Capture Device >> Device Selection >> Video device name, select the camera video node.

4. Hit Advanced Options... button

5. Type in the width and height, for example, 1280 and 1024.

6. Hit OK to save the settings and see the video feed.

Play mv camera using VLC

8 Gstreamer Usage

要安装最新的加速版 gstreamer 插件和应用程序,请运行以下命令:

sudo apt-get update

sudo apt-get install nvidia-l4t-gstreamer

sudo ldconfig

rm -rf .cache/gstreamer-1.0/

export DISPLAY=:0

  • 视频预览1080p HD

gst-launch-1.0 nvv4l2camerasrc device=/dev/video0 ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false

gst-launch-1.0 nvv4l2camerasrc device=/dev/video0 ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)NV12" ! nv3dsink sync=false

  • 视频预览1080p HD(using xvimagesink sink if supported)

export DISPLAY=:0

gst-launch-1.0 -e v4l2src io-mode=4 device=/dev/video0 do-timestamp=true ! 'video/x-raw, width=1920, height=1080, framerate=30/1, format=UYVY' ! xvimagesink sync=false

  • 视频预览720p@60 HD(模组支持此分辨率时)

gst-launch-1.0 nvv4l2camerasrc ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60/1" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false

  • 视频预览1280*1080@45fpsHD

gst-launch-1.0 nvv4l2camerasrc ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1280, height=(int)1080, framerate=(fraction)45/1" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false

  • 视频预览640*480@130fps(模组支持此分辨率时)

gst-launch-1.0 nvv4l2camerasrc ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)640, height=(int)480, framerate=(fraction)130/1" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nv3dsink sync=false

  • 并列预览两路视频 1080p HD

WIDTH=960

HEIGHT=540

CAPS="video/x-raw(memory:NVMM),format=(string)UYVY, width=1920, height=1080"

gst-launch-1.0 nvcompositor name=comp sink_0::xpos=0 sink_0::ypos=0 sink_0::width=$WIDTH sink_0::height=$HEIGHT sink_1::xpos=$WIDTH sink_1::ypos=0 sink_1::width=$WIDTH sink_1::height=$HEIGHT ! nv3dsink nvv4l2camerasrc device=/dev/video0 ! $CAPS ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420"! comp. nvv4l2camerasrc device=/dev/video1 ! $CAPS ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420"! comp.

  • Gstreamer 嵌入到 OpenCV

I think maybe OpenCV do not support I420 data format input,so you should convert it to BGR format.

gst-launch-1.0 nvv4l2camerasrc ! video/x-raw(memory:NVMM), format=(string)UYVY, width=(int)1920, height=(int)1080 ! nvvidconv ! video/x-raw(memory:NVMM), format=(string)I420 ! nvvidconv ! video/x-raw, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink

  • 视频录像1080p HD

gst-launch-1.0 nvv4l2camerasrc num-buffers=300 ! "video/x-raw(memory:NVMM),format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)NV12" ! nvv4l2h264enc control-rate=1 bitrate=10000000 ! h264parse ! qtmux ! filesink location=filename.mp4 -e

  • 录像回放

gst-launch-1.0 filesrc location=filename.mp4 ! qtdemux ! queue ! h264parse ! nvv4l2decoder ! nv3dsink -e

  • 抓拍图片

gst-launch-1.0 v4l2src num-buffers=1 ! "video/x-raw,format=(string)UYVY, width=(int)1920, height=(int)1080" ! nvvidconv ! "video/x-raw(memory:NVMM),format=(string)I420" ! nvjpegenc ! filesink location=jpgname.jpg


9 yavta(仅支持流模式)

9.1 yavta安装

git clone https://github.com/veyeimaging/yavta.git

cd yavta;make

国内用户可访问gitee仓库

9.2 设置图像格式

v4l2-ctl --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=UYVY

9.3 保存图片到文件
9.3.1 通常情况下

此处的通常情况,指的是WIDTH是256的整数倍。

  • UYVY格式

以XAVIER平台为例

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

9.3.2 GX-MIPI-IMX662

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


10 Jetson multimedia-api samples

Jetson平台上提供了Jetson Linux API 供开发者使用。具体jetson_multimedia_api包的安装请参考nVidia官方文档。

对于GX系列相机,已经在相机内集成了ISP功能,因此不能使用libargus获取数据,而可以直接使用使用标准V4L2接口从/dev/videoX设备文件获取数据。

安装 Jetson 系统后,可进入多媒体 API 示例目录,自行编译并运行以下命令以预览摄像头视频:

cd /usr/src/jetson_multimedia_api/samples/12_v4l2_camera_cuda

make

./v4l2_camera_cuda -d /dev/video0 -s 1920x1080 -f UYVY

该命令将使用 /dev/video0 设备,以 1920×1080 分辨率和 UYVY 格式进行实时视频预览。


11 v4l2-ctl 应用范例

11.1 安装v4l2-utils

sudo apt-get install v4l-utils

11.2 使用v4l2-ctl配置参数
11.2.1 列出相机支持的数据格式

v4l2-ctl --list-formats-ext

下面是在XAVIER系统下,GX-MIPI-IMX662的例子:

ioctl: VIDIOC_ENUM_FMT

        Type: Video Capture

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

                Size: Discrete 1920x1080

                        Interval: Discrete 0.017s (60.000 fps)

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

        [2]: 'NV16' (Y/CbCr 4:2:2)

                Size: Discrete 1920x1080

                        Interval: Discrete 0.017s (60.000 fps)

  • 帧率统计

v4l2-ctl --set-fmt-video=width=1920,height=1080,pixelformat=UYVY --stream-mmap --stream-count=-1 --stream-to=/dev/null

  • 保存图片到文件

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

11.2.2 列出驱动中实现的相机的可配置参数

v4l2-ctl -L

User Controls

                   trigger_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) : 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 --set-ctrl [ctrl_type]=[val]

v4l2-ctl --get-ctrl [ctrl_type]

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

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

11.2.3 配置触发模式

v4l2-ctl --set-ctrl trigger_mode=[0-2]

0:流模式

1:普通触发模式

2:多相机同步模式

11.2.4 配置触发源

v4l2-ctl --set-ctrl trigger_src=[0-1]

0: 软触发

1: 硬触发

11.2.5 软触发一次

v4l2-ctl --set-ctrl soft_trgone=1

11.2.6 设置帧率

v4l2-ctl --set-ctrl frame_rate=[1-max]

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

11.3 流模式

11.3.1 设置图像格式

以最大画面为例:

v4l2-ctl --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=UYVY

v4l2-ctl --set-ctrl frame_rate=$FPS

11.3.2 帧率统计

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

11.3.3 保存图片到文件
11.3.3.1 通常情况下
  • 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"

11.3.3.2 使用opencv预览GREY格式图像

sudo apt install python3-opencv

  • 我们提供了一个简单的sample实现此功能:

python3 ./v4l2_opencv_show2.py --width 1920 --height 1080 --fps 30

11.4 触发模式

11.4.1 准备工作

v4l2-ctl --set-ctrl low_latency_mode=1

v4l2-ctl --set-fmt-video=width=$WIDTH,height=$HEIGHT,pixelformat=UYVY

v4l2-ctl --set-ctrl frame_rate=$FPS

11.4.2 软触发
11.4.2.1 设置模式

v4l2-ctl --set-ctrl trigger_mode=1

v4l2-ctl --set-ctrl trigger_src=0

v4l2-ctl --set-ctrl vi_time_out_disable=1

11.4.2.2 开始取图
  • 通常情况下

此处的通常情况,指的是WIDTH是256的整数倍。

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

  • GX-MIPI-IMX662

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

11.4.2.3 进行软触发操作

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

v4l2-ctl --set-ctrl soft_trgone=1

11.4.2.4 停止触发和采集

由于内核驱动中,死循环等待新图片,因此需要先取消vi_time_out_disable,然后再退出采集操作。

v4l2-ctl --set-ctrl vi_time_out_disable=0

在取图命令的终端中,按Ctrl+C退出采集操作。

11.4.3 硬触发

使用jetson-gpio进行触发操作,首先请安装并配置好jetson-gpio。

下面以使用jetson GPIO40(Board num)为模拟触发源,上升沿触发为例。

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

11.4.3.1 硬件连接
11.4.3.2 TBD


11.4.3.3 设置模式

v4l2-ctl --set-ctrl trigger_mode=1

v4l2-ctl --set-ctrl trigger_src=1

v4l2-ctl --set-ctrl vi_time_out_disable=1

11.4.3.4 开始取图
  • 通常情况下

此处的通常情况,指的是WIDTH是256的整数倍。

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

11.4.3.5 进行硬触发操作

python gpio_trigger_jetson.py

Note:触发脚本链接

11.4.3.6 停止触发和采集

由于内核驱动中,死循环等待新图片,因此需要先取消vi_time_out_disable,然后再退出采集操作。

v4l2-ctl --set-ctrl vi_time_out_disable=0

在取图命令的终端中,按Ctrl+C退出采集操作。


12 i2c脚本使用说明

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

gx_mipi_i2c.sh user guide

13 参考资料

14 本文修改记录

  • 2025-12-11

第一个发布版本