从 IP 摄像机馈送时 OpenCV VideoCapture 出现故障

OpenCV's VideoCapture malfunctioning when fed from IP Camera

我只是想通过OpenCV的简单代码读取IP Camera直播流,即如下:

import numpy as np
import cv2

src = 'rtsp://id:pass@xx.xx.xx.xx'

cap = cv2.VideoCapture(src)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

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

这里的问题是,有时它通过显示 运行 实时视频像一个魅力一样工作,但有时它会产生很多空白 windows 一直弹出直到作业被终止.就像下图:

为什么会发生,又该如何避免?

也许您应该涵盖视频捕获未能建立健康流的情况。

请注意,在某些情况下,即使视频捕获打开,也可能收不到帧。这可能是由于网络流量拥塞、计算资源不足、部分网络摄像机省电模式等多种原因造成的。

因此,我建议您检查帧大小并确保您的 VideoCapture 对象以正确的形状接收帧。 (您可以调试并查看可见帧的大小,以了解相机的预期分辨率。)

像下面这样改变你的循环可能会有所帮助

min_expected_frame_size = [some integer]
while(cap.isOpened()):
    ret, frame = cap.read()
    
    width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    
    if ret==True and ((width*height) >= min_expected_frame_size):    
        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break