工具:v4l-utils,先安装

bash

运行

sudo apt update
sudo apt install v4l-utils

设备示例:/dev/video0(USB 主采集设备)

前置知识点

  1. UVC USB 摄像头一般生成 /dev/video0(采集)、/dev/video1(控制,不要用来采集图像)
  2. 所有命令加 -d /dev/videoX 指定设备
  3. OpenCV 底层本质调用 V4L2 接口;v4l2-ctl 优先级高于 OpenCV set

一、基础硬件信息查询(实例 + 样例输出)

1. 查看设备基础信息 --info

命令

bash

运行

v4l2-ctl -d /dev/video0 --info

实例输出

plaintext

Driver name      : uvcvideo
Card type        : USB Camera
Bus info         : usb-3f980000.usb-1.2
Driver version   : 5.15.0
Capabilities     : 0x84a00001
        Video Capture
        Metadata Capture
        Streaming
        Extended Pix Format
Device Caps      : 0x04200001
        Video Capture
        Streaming
        Extended Pix Format

关键字段解读:

  • Driver name=uvcvideo → 标准 USB 摄像头
  • Bus info 携带 usb 路径,用来区分多个 USB 相机

2. 区分:USB 相机 / RDK 板载 MIPI 相机(sysfs 查询)

bash

运行

readlink -f /sys/class/video4linux/video0/device

✅ USB 相机样例输出(包含 usb)

plaintext

/sys/devices/platform/3f980000.usb/usb1/1-2/1-2:1.0

❌ 板载 MIPI/ISP 样例(不含 usb)

plaintext

/sys/devices/platform/soc/...horizon-isp

3. 列出本机全部 video 节点

bash

运行

ls /dev/video*

输出示例

plaintext

/dev/video0  /dev/video1  /dev/video2  /dev/video3

4. USB 总设备列表(查看摄像头 VID/PID)

bash

运行

lsusb

实例输出

plaintext

Bus 001 Device 004: ID 0c45:6366 Microdia USB Camera

0c45:6366 = 厂商 ID: 设备 ID


二、查询相机支持的图像格式、分辨率、帧率【最重要】

命令

bash

运行

v4l2-ctl -d /dev/video0 --list-formats-ext

真实实例输出

plaintext

ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        [0]: 'MJPG' (Motion-JPEG, compressed)
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 800x600
                        Interval: Discrete 0.033s (30.000 fps)
        [1]: 'YUYV' (YUYV 4:2:2)
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1280x720
                        Interval: Discrete 0.100s (10.000 fps)

解读:

  • MJPG:压缩格式,1280×720@30fps,推荐优先使用,节省 USB 带宽
  • YUYV:原始图像,1280×720 只能跑 10fps,带宽压力大

查询当前正在使用的图像格式

bash

运行

v4l2-ctl -d /dev/video0 --get-fmt-video

实例输出

plaintext

Width/Height      : 1280/720
Pixel Format      : 'MJPG' (Motion-JPEG)
Field             : None
Bytes per Line    : 0
Size Image        : 1843200
Colorspace        : sRGB
Transfer Function : Default (maps to sRGB)
YCbCr/HSV Encoding: Default (maps to BT.601)
Quantization      : Default (maps to Full Range)
Flags             :

设置分辨率 + 格式(V4L2 直接配置)

⚠️必须先关闭 OpenCV 程序,相机被占用时配置不生效!

bash

运行

# 设置 1280×720 MJPG
v4l2-ctl -d /dev/video0 --set-fmt-video=width=1280,height=720,pixelformat=MJPG

三、摄像头图像控制参数(曝光、亮度、对比度查询与设置)

1. 查询所有可调控制项

bash

运行

v4l2-ctl -d /dev/video0 --list-ctrls

真实实例输出

plaintext

User Controls

                    brightness 0x00980900 (int)    : min=-64 max=64 step=1 default=0 value=0
                      contrast 0x00980901 (int)    : min=0 max=95 step=1 default=32 value=32
                    saturation 0x00980902 (int)    : min=0 max=100 step=1 default=64 value=64
                           hue 0x00980903 (int)    : min=-180 max=180 step=1 default=0 value=0
        white_balance_automatic 0x0098090c (bool)   : default=1 value=1
                          gamma 0x00980910 (int)    : min=100 max=300 step=1 default=220 value=220
           exposure_auto_priority 0x00980913 (bool)   : default=0 value=0
                   gain_automatic 0x00980914 (bool)   : default=1 value=1
                         exposure 0x00980915 (int)    : min=1 max=5000 step=1 default=312 value=312 flags=inactive
Camera Controls

                  auto_exposure 0x009a0901 (menu)   : min=0 max=3 default=3 value=3
                                 0: Manual Mode
                                 1: Auto Mode
                                 2: Shutter Priority
                                 3: Aperture Priority

2. 参数设置实例

示例 1:关闭自动曝光,手动设置曝光值

bash

运行

# 自动曝光=0 手动模式
v4l2-ctl -d /dev/video0 --set-ctrl auto_exposure=0
# 设置曝光值
v4l2-ctl -d /dev/video0 --set-ctrl exposure=600

示例 2:关闭自动白平衡

bash

运行

v4l2-ctl -d /dev/video0 --set-ctrl white_balance_automatic=0

示例 3:调节亮度

bash

运行

v4l2-ctl -d /dev/video0 --set-ctrl brightness=10

示例 4:读取单项参数当前值

bash

运行

v4l2-ctl -d /dev/video0 --get-ctrl brightness

输出:brightness: 10

重要提醒: OpenCV cap.set() 对曝光、白平衡等控制支持很差;工业调参优先使用 v4l2-ctl


四、帧速率 查询与设置

查询当前帧率

bash

运行

v4l2-ctl -d /dev/video0 --get-parm-video

实例输出

plaintext

Frame rate : 30000/1000 (30.000 fps)
Frame period : 1/30 (0.033 s)

设置帧率(需要该分辨率下硬件支持)

bash

运行

v4l2-ctl -d /dev/video0 --set-parm=30

五、进程占用查询(程序卡死、相机无法打开场景)

查看哪个进程占用 /dev/video0

bash

运行

sudo lsof /dev/video0
# 或者
sudo fuser /dev/video0

实例输出 lsof:

plaintext

COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
python3 1823 sunrise   10u   CHR  81,0      0t0 5678 /dev/video0

PID=1823 即为占用进程,可以 kill 释放设备

bash

运行

kill -9 1823

六、权限信息查询

bash

运行

ls -l /dev/video0

实例输出

plaintext

crw-rw----+ 1 root video 81, 0 Jul 15 10:22 /dev/video0
  • 归属组:video 普通用户加入 video 组(RDK sunrise 用户)

bash

运行

sudo usermod -aG video sunrise
# 重新登录生效

七、Python OpenCV 获取相机参数(代码实例)

python

运行

import cv2

cap = cv2.VideoCapture("/dev/video0", cv2.CAP_V4L2)
if cap.isOpened():
    w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    fps = cap.get(cv2.CAP_PROP_FPS)
    fourcc_int = int(cap.get(cv2.CAP_PROP_FOURCC))
    fourcc = "".join([chr((fourcc_int >> 8*i)&0xFF) for i in range(4)])
    print(f"分辨率:{w} × {h}")
    print(f"FPS:{fps}")
    print(f"图像格式FOURCC:{fourcc}")
cap.release()

限制:OpenCV无法枚举全部支持分辨率,只能读取当前生效配置;枚举规格必须依靠v4l2-ctl

八、常见坑总结

  1. 修改参数前,关闭所有 OpenCV、采集程序,设备被占用时设置不生效;
  2. v4l2-ctl 设置的参数断电 / 重新插拔摄像头会丢失;如需永久保存需要写脚本开机自动配置;
  3. YUYV 高分辨率下帧率上不去,优先切换 MJPG 格式;
  4. OpenCV cap.set 设置曝光经常无效,改用 v4l2-ctl 控制;
  5. 区分 /dev/video0 / /dev/video1,video1 是 metadata 通道,不要用来采集画面。

 

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐