Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV中的非整数帧编号?_Python_Opencv_Video Capture_Video Processing - Fatal编程技术网

Python OpenCV中的非整数帧编号?

Python OpenCV中的非整数帧编号?,python,opencv,video-capture,video-processing,Python,Opencv,Video Capture,Video Processing,我在OSX(10.10.5)上使用python中的OpenCV。我对OpenCV相当陌生。现在我只是想找出视频中某个事件发生的帧号。我正在使用轨迹栏浏览视频 我遇到的问题是OpenCV报告的是非整数帧编号。我的程序应该将帧编号设置为轨迹栏位置。轨迹栏位置始终为整数,但帧编号不是整数。对于较长的视频,问题似乎更严重:对于较短的视频,当轨迹栏位置为254时,帧编号(如果不是整数)类似于253.9999999994。但是,对于较长的视频,帧编号越来越远离整数值(例如,当轨迹栏位置为11212时为112

我在OSX(10.10.5)上使用python中的OpenCV。我对OpenCV相当陌生。现在我只是想找出视频中某个事件发生的帧号。我正在使用轨迹栏浏览视频

我遇到的问题是OpenCV报告的是非整数帧编号。我的程序应该将帧编号设置为轨迹栏位置。轨迹栏位置始终为整数,但帧编号不是整数。对于较长的视频,问题似乎更严重:对于较短的视频,当轨迹栏位置为254时,帧编号(如果不是整数)类似于253.9999999994。但是,对于较长的视频,帧编号越来越远离整数值(例如,当轨迹栏位置为11212时为11212.20588235294,或当轨迹栏位置为26631时为26631.529411764703)。请注意,这些数字并不总是舍入或截断为与轨迹栏位置相同的整数

每个视频的总帧数也不是整数:我测试过的较短视频为1547.999999998,测试过的较长视频为92651.38235294117。较短的视频是.mov文件,较长的是.mp4,我使用ffmpeg从.mpg转码而来

为什么会这样?我怎样才能算出帧号?谢谢你的帮助!下面是我一直在使用的测试代码(请注意,它基于来自的帧捕获器):

一些示例(帧编号、轨迹栏位置)对:

较短视频(.mov): (1.0, 0) (171.99999999999997, 172) (842.9999999999999, 843) (1141.0, 1141) (1330.0, 1330) (111.99999999999999, 112) (235.99999999999997, 236) (590.9999999999999, 591) (1546.999999981547)

较长视频(.mp4): (1.0, 0) (6642.911764705882, 6642) (27496.11764705882, 27496) (49707.529411764706, 49707) (64786.294117647056, 64786)
(84065.38235294117,84065)

这很可能是因为您的帧速率不是整数。对于每个视频,调查视频的实际帧速率:

frame_rate = cv2.cv.CV_CAP_PROP_FPS
事实上,对于某些视频,有一个浮点帧速率。通常在电视里。。。至少在北美标准中,预期帧速率为30 FPS。但是,你很可能会有29.97 FPS。本文更详细地解释了:

然而,如果我能总结一下,早在上世纪70年代,在先进电子技术处理这一问题之前,在彩色电视引入之前,广播的速度实际上是每秒30帧,但由于发送彩色信息需要额外的信息,这些信息实际上干扰了声音信息,因此,他们不得不将FPS延迟0.03 FPS,以补偿和移动声音信息和颜色信息稍微不同步

但这不是重点。一个视频的浮点帧数高于另一个视频的原因完全取决于帧速率。因此,通过尝试在所需位置获取帧编号,可能会出现所需帧编号与视频中的实际帧不完全一致的情况,所以它会给你它最好对应的帧数,因为浮点帧速率,这就是为什么你会得到浮点结果

当您开始使帧索引变大时,也会出现漂移的原因仅仅是因为帧速率。当您开始指定更高的帧编号时,请记住,对于30/29.97场景,您希望在索引处捕获的帧是您想要的,但因为每30 FPS,您落后0.03,对于更大的帧索引,这种差异会加剧,因为你每30帧就有0.03的差异



关于获得确切的帧数,我这里没有什么建议。但是,您可能可以在所需的设置帧索引之前和之后提取一帧,然后从中查看情况。指定实际的帧索引本身(至少从我所看到的)在实践中很少使用,这正是原因所在

谢谢,这很有道理。我在这里的最终目标不是真正知道帧号。我有两段同一事件的视频,都是从不同的摄像机上拍摄的(以相同的帧速率、相同型号的摄像机等录制),但录制的开始时间不同。我希望通过识别每个视频中参考事件(灯亮/灭)的时间,能够非常精确地知道视频A中的哪些帧/时间对应于视频B中的哪些帧/时间,理想情况下可以下至单个帧。使用时间戳(即cv2.cv.cv_CAP_PROP_POS_MSEC)是一种更好的方法吗?@ERH是的。使用时间戳。我很惊讶我没有想到这一点。干得好!在这种情况下,请更改滑块,以便在实际时间中拖动,而不是帧编号本身。这可能会给你更好的解决方案。
frame_rate = cv2.cv.CV_CAP_PROP_FPS