第一次运行后,Python opencv cv2.VideoCapture.read()无限期卡住

时间:2019-11-29 10:15:44

标签: python opencv video video-streaming streaming

我在python上使用opencv,并且遇到cv2.VideoCapture.read()函数卡住的问题。这是一些原型代码:

requirements.txt

opencv-contrib-python==4.1.1.26

application.py

import cv2

def run_analysis(path_to_video):
    vs = cv2.VideoCapture(path_to_video)

    while True:
         frame = vs.read()
         if frame is None:
             break
         do_stuff_with_frame(frame)

    vs.release()

此代码一直在我的Mac上运行。仅当我将其作为Flask应用程序部署到Elastic Beanstalk(在Red Hat Linux上运行)时,它才第一次起作用。 我已经在github问题中看到了一些东西,这些东西可能暗示vs.release()无法释放文件指针,或者存在内存泄漏,但是我不太了解这些概念。

即使我无法获得答案,我也对采用强力方式使其工作感到满意。

2 个答案:

答案 0 :(得分:2)

您可以添加防护以确保cv2.VideoCapture()处理程序对象对isOpened()有效。另外,您可以检查status的{​​{1}}返回值,以确保该帧有效。另外,请确保提供给处理程序的路径有效。

read()

答案 1 :(得分:1)

根据openCV web site

  

如果没有抓取任何帧(相机已断开连接,或者视频文件中没有其他帧),则方法返回false,函数返回NULL指针。

在测试“无”后,您可以测试以查看“ frame”是否为假。 如有疑问,请使用“ print(frame)”

编辑:
我刚刚意识到您跳过了打开文件的最重要步骤。 需要检查它是否使用isOpened()打开

    vs = cv2.VideoCapture(path_to_video)
    if not vs.isOpened():
        print("Error: Could not open file: %s" % (path_to_video))
        return
    ........

编辑: 试试这个代码。通过扩展vs.read(),可以更清楚地知道返回的内容。

import cv2
def do_stuff_with_frame(image):
    pass

def run_analysis(path_to_video):
    vs = cv2.VideoCapture(path_to_video)
    if not vs.isOpened():
        print("Error: Could not open file: %s" % (path_to_video))
        return

    while True:
        retval, image = vs.read()
        if not retval:
            print("Video file finished. Total Frames: %d" % (vs.get(cv2.CAP_PROP_FRAME_COUNT)))
            break
        do_stuff_with_frame(image)

    vs.release()

# START OF PROGRAM
if __name__ == "__main__":
    run_analysis("test.mov")