OpenCV视频捕获和(-215:在函数“cvtColor”中断言失败)!_src.empty()

3
这段代码原本能够正常运行。 但是当我再次运行它时,出现了以下错误。 我已经搜索了很多关于这个错误的资料,但是没有找到解决方案。 如有帮助,将不胜感激。
cv2.error: OpenCV(4.4.0) /tmp/pip-wheel-frffvd08/opencv-python/opencv/modules/imgproc/src/color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cvtColor'

下面的代码是我编写的 Python 代码。
import numpy as np
import cv2

cap = cv2.VideoCapture(0)
cap.set(3,640) # set Width
cap.set(4,480) # set Height

while(True):
#while(cap.isOpened()):
    ret, frame = cap.read()
    frame = cv2.flip(frame, -1) # Flip camera vertically
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame', frame)
    cv2.imshow('gray', gray)

    k = cv2.waitKey(30) & 0xff
    if k == 27: # press 'ESC' to quit
        break
cap.release()
cv2.destroyAllWindows()

我在我的设备上尝试了你的代码,它能正常运行。也许你的摄像头正在被另一个应用程序使用。你有检查过以下这个链接吗?验证你的摄像头是否被另一个任务使用并关闭它。这将解决问题。 - Shmn
1个回答

2

!_src.empty() 表示你有一个空帧。

当 cv2 无法从相机/文件/流中获取帧时,它不会显示错误,但它将在帧中设置 None 并在 ret 中设置 False - 你必须检查这些值之一。

if frame is not None: 
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # ... other code ...
else:
    print("empty frame")
    exit(1)

或者

if ret:  # if ret is True:
      gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
      # ... other code ...
else:
      print("empty frame")
      exit(1)

有时候cv2无法找到haarcascades文件。有一个特殊的变量,它包含了指向存放.xml文件的文件夹的路径 - cv2.data.haarcascades - 你可能需要使用它。
faceCascade = cv2.CascadeClassifier( os.path.join(cv2.data.haarcascades, "haarcascade_frontalface_default.xml") )

感谢回复。我按照你的建议修改了代码,但它却输出一个空白框架。最初视频是正常显示的。 我该如何让视频再次显示?另外,我不明白为什么用这个代码就无法获取框架。 - HaileyM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接