[具身智能-594]:Linux中,相机设备相关的信息设置与查询,给出具体信息实例。
·
工具:
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-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
八、常见坑总结
- 修改参数前,关闭所有 OpenCV、采集程序,设备被占用时设置不生效;
v4l2-ctl设置的参数断电 / 重新插拔摄像头会丢失;如需永久保存需要写脚本开机自动配置;- YUYV 高分辨率下帧率上不去,优先切换 MJPG 格式;
- OpenCV cap.set 设置曝光经常无效,改用 v4l2-ctl 控制;
- 区分
/dev/video0//dev/video1,video1 是 metadata 通道,不要用来采集画面。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)