工具:
v4l-utils,先安装
bash
运行
sudo apt update sudo apt install v4l-utils设备示例:/dev/video0(USB 主采集设备)
前置知识点
- UVC USB 摄像头一般生成
/dev/video0(采集)、/dev/video1(控制,不要用来采集图像) - 所有命令加
-d /dev/videoX指定设备 - 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-isp3. 列出本机全部 video 节点
bash
运行
ls /dev/video*输出示例
plaintext
/dev/video0 /dev/video1 /dev/video2 /dev/video34. USB 总设备列表(查看摄像头 VID/PID)
bash
运行
lsusb实例输出
plaintext
Bus 001 Device 004: ID 0c45:6366 Microdia USB Camera0c45: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 Priority2. 参数设置实例
示例 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/video0PID=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
八、常见坑总结
- 修改参数前,关闭所有 OpenCV、采集程序,设备被占用时设置不生效;
v4l2-ctl设置的参数断电 / 重新插拔摄像头会丢失;如需永久保存需要写脚本开机自动配置;- YUYV 高分辨率下帧率上不去,优先切换 MJPG 格式;
- OpenCV cap.set 设置曝光经常无效,改用 v4l2-ctl 控制;
- 区分
/dev/video0//dev/video1,video1 是 metadata 通道,不要用来采集画面。