[具身智能-594]:Linux中,相机设备相关的信息设置与查询,给出具体信息实例。

📅 2026/7/15 13:56:39 👁️ 阅读次数 📝 编程学习
[具身智能-594]:Linux中,相机设备相关的信息设置与查询,给出具体信息实例。

工具: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

重要提醒: OpenCVcap.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 通道,不要用来采集画面。