从 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
我只是想通过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