【问题标题】:OpenCv Python frame empty in mjpeg stream from webcam来自网络摄像头的 mjpeg 流中的 OpenCv Python 框架为空
【发布时间】:2015-07-08 13:31:20
【问题描述】:

我正在创建一个在网格中显示 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.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()

感谢和抱歉我的英语不好

【问题讨论】:

  • 您拨打cap2.read() 3 次,这是故意的还是只是测试的一部分?即 cap3 和 cap4 不被使用。
  • @MartinEvans 我的愚蠢错误

标签: python opencv python-3.x stream mjpeg


【解决方案1】:

我能否建议以下类型的方法:

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 语句。

【讨论】:

  • 谢谢!我会试试的,我会回来报告
  • 这个解决方案似乎已经解决了这个问题,非常感谢,如果有人需要这个我以这种方式创建了黑框:blackframe = np.zeros((640, 480, 1), np. uint8)
猜你喜欢
  • 2012-06-16
  • 1970-01-01
  • 2016-09-24
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多