来自网络摄像头的mjpeg流中的OpenCv Python帧为空
我正在创建一个在网格中显示4个mjpg摄像机的程序,我的问题是有时一个帧是空的,流冻结,我通过检查每个帧的大小来捕获错误,如果它等于1,我继续循环,我的问题是我仍然在控制环中,似乎溪流无法获得有效的帧,有什么建议吗来自网络摄像头的mjpeg流中的OpenCv Python帧为空,python,opencv,python-3.x,stream,mjpeg,Python,Opencv,Python 3.x,Stream,Mjpeg,我正在创建一个在网格中显示4个mjpg摄像机的程序,我的问题是有时一个帧是空的,流冻结,我通过检查每个帧的大小来捕获错误,如果它等于1,我继续循环,我的问题是我仍然在控制环中,似乎溪流无法获得有效的帧,有什么建议吗 import socket import numpy as np import cv2 cap = cv2.VideoCapture("http://85.90.40.19/mjpg/video.mjpg") cap2 = cv2.VideoCapture("http://85.9
import socket
import numpy as np
import cv2
cap = cv2.VideoCapture("http://85.90.40.19/mjpg/video.mjpg")
cap2 = cv2.VideoCapture("http://85.90.40.19/mjpg/video.mjpg")
cap3 = cv2.VideoCapture("http://85.90.40.19/mjpg/video.mjpg")
cap4 = cv2.VideoCapture("http://85.90.40.19/mjpg/video.mjpg")
cv2.namedWindow('frame', cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty('frame', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
while True:
try:
ret, frame = cap.read()
ret2, frame2 = cap2.read()
ret3, frame3 = cap2.read()
ret4, frame4 = cap2.read()
except:
print("try catch")
continue
size = np.size(frame)
size2 = np.size(frame2)
size3 = np.size(frame3)
size4 = np.size(frame4)
if (size or size2 or size3 or size4) == 1:
print("frame 0")
continue
# print("Dimensione" + str(size))
rframe = cv2.resize(frame, (640,480))
rframe2 = cv2.resize(frame2, (640,480))
rframe3 = cv2.resize(frame3, (640,480))
rframe4 = cv2.resize(frame4, (640,480))
print(ret,ret2,ret3,ret4)
vert1 = np.vstack((rframe,rframe2))
vert2 = np.vstack((rframe3,rframe4))
both = np.hstack((vert1,vert2))
print(both.shape)
# both.resize((1024, 768,3))
cv2.imshow('frame', both)
if cv2.waitKey(1) == 27:
break
cap.release()
cv2.destroyAllWindows()
感谢并抱歉我的英语不好我可以建议以下类型的方法吗:
try:
ret, frame = cap.read()
except:
ret, frame = (-1, blackframe)
try:
ret2, frame2 = cap2.read()
except:
ret2, frame2 = (-1, blackframe)
try:
ret3, frame3 = cap3.read()
except:
ret3, frame3 = (-1, blackframe)
try:
ret4, frame4 = cap4.read()
except:
ret4, frame4 = (-1, blackframe)
其中,blackframe
是您在捕获失败时可用的合适图像。这将允许继续显示其他帧
目的是删除导致执行返回顶部而不让任何其他代码执行的
continue
语句。我可以建议以下类型的方法:
try:
ret, frame = cap.read()
except:
ret, frame = (-1, blackframe)
try:
ret2, frame2 = cap2.read()
except:
ret2, frame2 = (-1, blackframe)
try:
ret3, frame3 = cap3.read()
except:
ret3, frame3 = (-1, blackframe)
try:
ret4, frame4 = cap4.read()
except:
ret4, frame4 = (-1, blackframe)
其中,blackframe
是您在捕获失败时可用的合适图像。这将允许继续显示其他帧
其目的是删除
continue
语句,该语句使执行返回顶部,而不让任何其他代码执行。您调用cap2.read()
3次,这是有意的还是只是测试的一部分?i、 e.cap3和cap4不被使用。@MartinEvans我的愚蠢错误你调用cap2.read()
3次,这是故意的还是只是测试的一部分?i、 第三章和第四章不习惯。@MartinEvans我愚蠢的错误谢谢!我会尝试一下,我会向大家汇报这个解决方案似乎已经解决了这个问题,非常感谢,如果有人需要,我用这种方式创建了黑框:黑框=np.zeros((640480,1),np.uint8)谢谢!我会尝试一下,我会向大家汇报这个解决方案似乎已经解决了这个问题,非常感谢,如果有人需要,我用这种方式创建了黑框:黑框=np.zeros((640480,1),np.uint8)