跳转至

Camera

Tip

目前 Armbian/Ubuntu 系统 ISP 存在问题 ,mipi 摄像头可能无法正常使用。

Rockchip 平台 MIPI CSI 接口信息如下:

主板 SOC 接口 模块 规格 接口引脚
K1 RK3568 MIPI_CSI gc5035 4 Lane x1
2 Lane x2
40 Pin
K1B RK3568 MIPI_CSI gc5035 4 Lane x1
2 Lane x2
40 Pin
K3 RK3562 MIPI_CSI_RX0、MIPI_CSI_RX1 gc5035 4 Lane x2
2 Lane x4
40 Pin
K7 V1 RK3576 MIPI_CSI0、MIPI_CSI1、MIPI_CSI3 4 Lane x3 40 Pin
K7 V2 RK3576 MIPI_CSI0、MIPI_CSI1、MIPI_CSI3 imx415 4 Lane x3 20 Pin
K7C RK3576 MIPI_CSI0、MIPI_CSI1、MIPI_CSI3 imx415 4 Lane x3 20 Pin
K8 RK3588 MIPI_CSI0、MIPI_CSI1、MIPI_DPHY0、MIPI_DPHY1 4 Lane x4
4 Lane x3+2 Lane x2
4 Lane x2
2 Lane x4
40 Pin

DTS 节点配置

RK3562

RK3562 平台 K3 MIPI 摄像头 dts 配置如下:

kernel-5.10/arch/arm64/boot/dts/rockchip/rk3562-kickpi-mipi-camera0.dtsi
kernel-5.10/arch/arm64/boot/dts/rockchip/rk3562-kickpi-mipi-camera1.dtsi

RK3568

RK3562 平台 K1/K1B MIPI 摄像头 dts 配置如下:

kernel-5.10/arch/arm64/boot/dts/rockchip/rk3568-kickpi-mipi-camera-gc5035.dtsi

RK3576

RK3576 平台 K7 MIPI 摄像头 dts 配置如下:

kernel-6.1/arch/arm64/boot/dts/rockchip/rk3576-kickpi-k7-cam0.dtsi
kernel-6.1/arch/arm64/boot/dts/rockchip/rk3576-kickpi-k7-cam1.dtsi
kernel-6.1/arch/arm64/boot/dts/rockchip/rk3576-kickpi-k7-cam3.dtsi

单摄配置

操作示例:以 K7 使用 cam0 单摄像头为例,修改 dts 配置,打开 cam0 设备树头文件,注释到其它摄像头设备树头文件。

--- a/kernel-6.1/arch/arm64/boot/dts/rockchip/rk3576-kickpi-k7.dtsi
+++ b/kernel-6.1/arch/arm64/boot/dts/rockchip/rk3576-kickpi-k7.dtsi
@@ -29,8 +29,8 @@
 #include "rk3576-kickpi-ir.dtsi"

+#include "rk3576-kickpi-k7-cam0.dtsi"
-#include "rk3576-kickpi-k7-cam1.dtsi"
-#include "rk3576-kickpi-k7-cam3.dtsi"
+//#include "rk3576-kickpi-k7-cam1.dtsi"
+//#include "rk3576-kickpi-k7-cam3.dtsi"

多摄配置

操作示例:以 K7 使用三摄像头为例,修改 dts 配置,打开 cam0 、cam1、cam3 的设备树头文件。

--- a/kernel-6.1/arch/arm64/boot/dts/rockchip/rk3576-kickpi-k7.dtsi
+++ b/kernel-6.1/arch/arm64/boot/dts/rockchip/rk3576-kickpi-k7.dtsi
@@ -29,8 +29,8 @@
 #include "rk3576-kickpi-ir.dtsi"

+#include "rk3576-kickpi-k7-cam0.dtsi"
+#include "rk3576-kickpi-k7-cam1.dtsi"
+#include "rk3576-kickpi-k7-cam3.dtsi"

v4l2-ctl

v4l2-ctl 是 Linux 系统中控制 V4L2(Video4Linux2)视频设备的命令行工具,核心用于配置和查询摄像头、视频采集卡等设备参数。

安装工具

sudo apt update
sudo apt install v4l-utils

摄像头节点

  • 列举摄像头设备:
sudo v4l2-ctl --list-devices

操作示例:通过 rkisp_mainpath 可知有两个摄像头,一般操作对应的第一个设备 /dev/video33 和 /dev/video42。

root@linaro-alip:/#sudo v4l2-ctl --list-devices
...
rkisp_mainpath (platform:rkisp-vir0):
        /dev/video33
        /dev/video34
        /dev/video35
        /dev/video36
        /dev/video37
        /dev/video38
        /dev/video41
        /dev/media3

rkisp_mainpath (platform:rkisp-vir1):
        /dev/video42
        /dev/video43
        /dev/video44
        /dev/video45
        /dev/video46
        /dev/video47
        /dev/video50
        /dev/media4
...

摄像头信息

  • 查询制定摄像头节点支持的详细格式:
sudo v4l2-ctl --list-formats-ext --device=/dev/video*

操作示例:查看 /dev/video33 节点摄像头信息。

root@linaro-alip:/#sudo v4l2-ctl --list-formats-ext --device=/dev/video33
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture Multiplanar

        [0]: 'UYVY' (UYVY 4:2:2)
                Size: Stepwise 32x32 - 3840x2160 with step 8/8
        [1]: 'NV16' (Y/UV 4:2:2)
                Size: Stepwise 32x32 - 3840x2160 with step 8/8
        [2]: 'NV61' (Y/VU 4:2:2)
                Size: Stepwise 32x32 - 3840x2160 with step 8/8
        [3]: 'NV21' (Y/VU 4:2:0)
                Size: Stepwise 32x32 - 3840x2160 with step 8/8
        [4]: 'NV12' (Y/UV 4:2:0)
                Size: Stepwise 32x32 - 3840x2160 with step 8/8
        [5]: 'NM21' (Y/VU 4:2:0 (N-C))
                Size: Stepwise 32x32 - 3840x2160 with step 8/8
        [6]: 'NM12' (Y/UV 4:2:0 (N-C))
                Size: Stepwise 32x32 - 3840x2160 with step 8/8

摄像头帧率

sudo v4l2-ctl -d /dev/video* \
 --set-fmt-video=width=1920,height=1080,pixelformat='MJPG' \
 --stream-mmap=4 \
 --set-selection=target=crop,flags=0,top=0,left=0,width=1920,height=1080 \
 --stream-count=500

操作示例:

root@linaro-alip:/#sudo v4l2-ctl -d /dev/video33 \
 --set-fmt-video=width=3840,height=2160\
 --stream-mmap=4 \
 --set-selection=target=crop,flags=0,top=0,left=0,width=3840,height=2160 \
 --stream-count=500
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.00 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.00 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.00 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.00 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.00 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.00 fps
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 30.00 fps
<<<<<<<<^C
root@linaro-alip:/#

Note

命令解析
1. v4l2-ctl -d /dev/video33
v4l2-ctl:Video4Linux2 控制工具,用于配置和控制 V4L2 兼容的视频设备。
-d /dev/video33:指定操作的视频设备为 /dev/video33
2. --set-fmt-video=width=1920,height=1080,pixelformat='MJPG':配置视频输出格式。
width=1920,height=1080:设置视频分辨率为 1920x1080(1080P)
pixelformat='MJPG':设置像素格式为 MJPEG( Motion JPEG,一种压缩格式)
3. --stream-mmap=4:启用内存映射(mmap)方式捕获视频流,=4 表示分配 4 个缓冲区用于流捕获(多缓冲区可以减少帧丢失)。
4. --set-selection=target=crop,flags=0,top=0,left=0,width=1920,height=1080 :设置视频裁剪区域。
target=crop:指定操作对象为裁剪区域。
flags=0:无特殊标志(默认)。
top=0,left=0,width=1920,height=1080:设置裁剪区域从左上角 (0,0) 开始,大小为 1920x1080(即使用完整画面,不裁剪)。
5. --stream-count=500:指定捕获的视频帧数为 500 帧,捕获完成后自动停止。

GStreamer

GStreamer 是一个跨平台、开源的多媒体框架,核心定位是「多媒体处理的 “管道(Pipeline)” 引擎」—— 它能将音频 / 视频的采集、编码、解码、过滤、传输、渲染等功能拆分成独立的「插件(Plugin)」,再通过灵活的 “管道” 组合,快速实现复杂的多媒体应用(比如视频播放、直播推流、音视频转码、摄像头采集等)。

安装工具

sudo apt update
sudo apt install gstreamer1.0-tools
sudo apt install gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly

命令行捕获图片

sudo gst-launch-1.0 v4l2src num-buffers=1 device=/dev/video* ! jpegenc ! filesink location=picture.jpg

命令行预览

  • autovideosink 方式:
sudo gst-launch-1.0 v4l2src device=/dev/video* ! video/x-raw,format=NV12,width=800,height=600,framerate=30/1 ! videoconvert ! autovideosink
  • waylandsink 方式(gnome wayland 架构桌面使用该方式进行预览):
sudo gst-launch-1.0 v4l2src device=/dev/video* ! video/x-raw,width=1280,height=720,framerate=30/1 ! videoconvert ! waylandsink

操作示例

sudo gst-launch-1.0 v4l2src device=/dev/video33 ! video/x-raw,width=800,height=600,framerate=30/1 ! videoconvert ! waylandsink

Note

命令解析:
1. gst-launch-1.0:GStreamer 的命令行工具,用于快速构建和运行 GStreamer 管道。
2. v4l2src device=/dev/video33
v4l2src:视频 4Linux2 源元件,用于从符合 V4L2 标准的视频设备(如摄像头)捕获数据。
device=/dev/video33:指定要使用的视频设备文件,这里是 /dev/video33(不同设备的摄像头编号可能不同)。
3. video/x-raw,format=NV12,width=800,height=600,framerate=30/1:用于指定视频格式。
video/x-raw:表示原始未压缩视频。
format=NV12:视频像素格式为 NV12(一种常见的 YUV 格式,适合硬件加速)。
width=800,height=600:视频分辨率为 800x600。
framerate=30/1:帧率为 30 帧 / 秒。
4. videoconvert:视频格式转换元件,用于将输入视频格式转换为后续元件支持的格式(这里主要是为了适配显示元件的需求)。
5. autovideosink:自动选择合适的视频输出元件,会根据系统环境自动选择最佳的视频显示方式(如 X11、Wayland 或直接渲染等)。