【问题标题】:use cv2.VideoCapture to capture a picture使用 cv2.VideoCapture 捕捉图片
【发布时间】:2025-11-25 19:45:01
【问题描述】:

我想使用我的笔记本电脑网络摄像头使用以下代码拍摄照片:

import cv2
cap = cv2.VideoCapture(1)
while(True):
    ret, frame = cap.read()
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()


cv2.destroyAllWindows()

但它会抛出此错误:

cv2.imshow('frame', frame) cv2.error: OpenCV(4.0.0) C:\projects\opencv-python\opencv\modules\highgui\src\window.cpp:350: 错误:(-215:断言失败)size.width>0 && size.height>0 in 函数'cv::imshow'

我该如何解决这个错误?

【问题讨论】:

  • 总是检查ret - 结果状态。如果 OpenCV 从相机获取值有问题,那么它不会引发错误,但它会在 ret 中返回 False 并且它可能在 frame 中具有 None 和更高版本的 imshow 可能无法显示 None
  • 我记得笔记本电脑网络摄像头的编号为0(零),而不是1

标签: python opencv


【解决方案1】:

OpenCV 无法从相机或流中获取帧时,它不会引发错误,但它会在ret(返回状态)中返回False(返回状态),因此您应该检查它。它还在frame 中返回Noneimshow 有问题显示None - 它没有宽度和高度 - 所以你得到size.width>0 && size.height>0 的错误

据我所知,大多数笔记本电脑网络摄像头的编号为0,而不是1

这适用于我的笔记本电脑网络摄像头

import cv2

cap = cv2.VideoCapture(0) # zero instead of one

while True:
    ret, frame = cap.read()

    if not ret: # exit loop if there was problem to get frame to display
        break

    cv2.imshow('frame', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

编辑: 正如 Dave W. Smith 在评论中所说:一些笔记本电脑可能需要时间来发送正确的图像,然后这里的版本不会退出循环

while True:
    ret, frame = cap.read()

    if ret: # display only if status (ret) is True and there is frame
        cv2.imshow('frame', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

【讨论】:

  • break 可能过于激进。在较旧的 Thinkpad 上,前几次捕捉图像的尝试都会失败。我建议扔一个柜台。
【解决方案2】:
import numpy as np
import cv2

cap = cv2.VideoCapture(0)  #it can be one also...but generally zero

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()
    cv2.imshow('Capture', frame)
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

试试这个...它适用于我的...确保已安装 numpy

【讨论】:

  • 拜托,你能用更详细的解释来扩展你的答案吗?这对理解非常有用。谢谢!
  • cv2.VideoCapture() 从网络摄像头捕获实时提要...cap.read() 将逐帧读取提要并 imshow 显示输出...由于 while 循环而重复发生...如果按下“q”..然后循环停止....最后如果相机停止 cap.release() 关闭窗口并且 cv2.destroyAllWindows 执行杀死程序的工作