You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下调用cv2.VideoCapture(0,cv2.CAP_DSHOW)返回None无法调分辨率

Ubuntu下OpenCV摄像头参数设置问题解答

核心问题解答

  • CAP_DSHOW是Windows平台专属的DirectShow摄像头API,Linux环境完全不支持,你调用时返回None是正常现象,不存在操作错误。
  • CAP_DSHOW不是OpenCV唯一支持调整分辨率、FPS的API,Linux原生的V4L2框架(对应参数cv2.CAP_V4L2)本身就完全支持参数调整,你遇到的设置不生效问题是其他原因导致的。

问题排查与修复方案

1. 先确认摄像头硬件支持的参数范围

很多时候设置不生效是因为你指定的分辨率/帧率不在摄像头的官方支持列表里,OpenCV会自动降级到最近的支持参数。你可以在终端执行以下命令查询所有支持的参数:

v4l2-ctl --list-formats-ext

输出会列出每个分辨率下对应的可设置帧率,确认你要设置的1920*1080在列表中再进行后续操作。

2. 修正参数设置逻辑

V4L2的参数设置不是立即生效的,摄像头需要几帧的时间适配新参数,同时要主动检查set方法的返回值确认是否设置成功,参考写法:

camera = cv2.VideoCapture(0, cv2.CAP_V4L2)
# 检查摄像头是否成功打开
if not camera.isOpened():
    raise RuntimeError("摄像头打开失败")
# 设置参数并打印结果确认是否成功
set_w_res = camera.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
set_h_res = camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
set_fps = camera.set(cv2.CAP_PROP_FPS, 30)
print(f"宽度设置结果:{set_w_res}, 高度设置结果:{set_h_res}, FPS设置结果:{set_fps}")
# 丢弃前5帧缓存的旧参数数据,确保后续读取的是新分辨率的帧
for _ in range(5):
    camera.read()

3. 修正帧读取的判断逻辑

你现有代码的判断逻辑存在严重漏洞:camera.read()的第一个返回值retval已经标记了帧读取是否成功,你直接调用im.any()会在读取失败、im为None时直接抛出异常。修正后的循环写法:

while(True):
    retval, im = camera.read()
    # 先判断读取是否成功,再操作图像
    if retval:
        cv2.imshow("image", im)
    else:
        # 读取失败可以选择重试或者打印告警
        continue

    k = cv2.waitKey(33)
    if k==27: # 按Esc键退出
        print('Resolution: {0}x and {1}y'.format(im.shape[1],im.shape[0]))
        print('FPS: {0}'.format(camera.get(cv2.CAP_PROP_FPS)))
        break

camera.release()
cv2.destroyAllWindows()

内容的提问来源于stack exchange,提问作者TIZ012

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:15:03