繁体   English   中英

如何使用OpenCV(Python)读取视频文件而无需循环(Mac OS)?

[英]How can I use OpenCV (Python) to read a video file WITHOUT looping (Mac OS)?

我正在用python写一个简单的OpenCV脚本来进行一些机器学习。 我想向它提供一系列视频文件,它将处理然后退出并吐出一些参数。 但是,当我使用cv2.VideoCapture打开视频文件时,它会无限循环。 如何检测我何时播放了视频的结尾?

**编辑**因此,一些人指出,读取到达文件末尾时应该返回一个空框架。 我试图寻找它,它可以在我的Linux机器上运行,但不能在我的Mac上运行。 在Mac上,它只是循环播放并继续播放,就像文件没有尽头一样。 有任何想法吗?

读取循环的代码如下所示,除非我按esc键,否则它会无限循环。

cam = cv2.VideoCapture(sourceVideo)            
while True:
    ret, img = cam.read()                      
    cv2.imshow('detection', img)
    print ret
    if (0xFF & cv2.waitKey(5) == 27) or img.size == 0:
        break

请注意,ret始终返回True,而img始终是有效数据。 是否有可能我不应该使用VideoCapture()进行此类阅读? 我不想使用较旧的cv命令,因为我需要使用cv2使用的NumPy数组。

**编辑**好,找到了一个合理的解决方案。 我发现至少有其他人在Mac OS中也遇到了类似的问题: OpenCV捕获会循环播放视频/未检测到最后一帧

我的猜测是Mac OS中的OpenCV设置或文件格式存在问题。

正确的解决方案通常是检查返回的帧的类型,因此这应该可行:

    cam = cv2.VideoCapture(sourceVideo)            
    while True:
        ret, img = cam.read()                      
        if (type(img) == type(None)):
            break

        cv2.imshow('detection', img)
        print ret
        if (0xFF & cv2.waitKey(5) == 27) or img.size == 0:
            break

但是,如果您遇到问题,则不会检测到最后一帧。 无论如何,有一个合理的解决方法,即检查文件中的帧数并简单地进行跟踪。

    framecount = cam.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)

    frames = 0
    while frames < framecount:
        ret, img = cam.read()  
        frames += 1     

        if (type(img) == type(None)):
            break

        cv2.imshow('detection', img)
        print ret
        if (0xFF & cv2.waitKey(5) == 27) or img.size == 0:
            break

不要忘记添加检查视频文件是否已成功打开。

if( !cam.isOpened() )
  throw "Error when reading image file";

通过将它们通过管道传送到cv :: Mat中来抓取帧

Mat frame;

for( ; ; )
{
    cam >> frame;
    if(!frame)
        break;
    imshow("w", frame);
    waitKey(20);
}

如果帧为假,则循环应正确终止。

为了也完全终止循环,您可以执行

cam.get(CV_CAP_PROP_FRAME_COUNT)

以获得确切的帧数。 无法获得无循环的视频,因为其增量读取。 您可以将其包装到单独的函数中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM