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

Ale*_*are 6 python video streaming opencv video-streaming

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

要求.txt

opencv-contrib-python==4.1.1.26
Run Code Online (Sandbox Code Playgroud)

应用程序.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()
Run Code Online (Sandbox Code Playgroud)

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

即使我无法得到原因的答案,我也会很高兴以一种蛮力的方式让它发挥作用。

ron*_*ron 2

根据openCV 网站

如果没有捕获任何帧(相机已断开连接,或者视频文件中没有更多帧),则方法返回 false 并且函数返回 NULL 指针。

您可以在测试“无”后测试“框架”是否为假。如果有疑问,“打印(框架)”

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

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

编辑:试试这个代码。通过扩展,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")
Run Code Online (Sandbox Code Playgroud)