![](/img/trans.png)
[英]how do I use OpenCV to read video from a NamedTempFile in python
[英]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.