gpt4 book ai didi

python - 如何使用 OpenCV (Python) 在不循环的情况下读取视频文件 (Mac OS)?

转载 作者:太空宇宙 更新时间:2023-11-03 11:32:01 25 4
gpt4 key购买 nike

我正在用 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 capture loops video/Does not detect last frame

我的猜测是我们在 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);
}

循环应该在 frame 为 false 后正确终止。

为了完全终止循环,您可以这样做

cam.get(CV_CAP_PROP_FRAME_COUNT)

获取确切的帧数。获取没有循环的视频是不可能的,因为它是增量读取的。不过,您可以将其包装到一个单独的函数中。

关于python - 如何使用 OpenCV (Python) 在不循环的情况下读取视频文件 (Mac OS)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16703345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com