我正在运行视频处理算法(python opencv),并希望将逐帧分析与类似的商业算法进行比较。我有一个由类似的算法生成的csv文件,该文件具有时间戳记以及整个视频的相应输出。 csv文件的格式如下所示。带有时间戳和TRUE / FALSE(1/0)。
| Time | Output|
|------------------|--------|
| 00:01:10.345 | 1 |
视频是30fps的.avi文件。我在使两个alg之间的框架对齐时遇到问题,因此我可以比较输出。到目前为止,这是我尝试过的。
我尝试通过在读取每一帧之前将时间戳设置为来自csv文件的方式来播放视频。 csv中的每个时间戳相隔33ms(通过计算确认)。它以30fps的速度录制,因此每帧应该有一个时间戳。
如上所示,时间戳的格式为hh:mm:ss.000。这是我设置时间的代码:
def setByTime():
cap.set(0,timeToMilli(csv['Time'][index]))
def timeToMilli(s):
s = s.replace(".",":")
hours, minutes, seconds, milliseconds = s.split(":")
return int(hours)*60*60*1000 + int(minutes)*60*1000 + int(seconds)*1000 + int(milliseconds)
但是,这不能正确播放视频。我可以在VLC中打开同一视频并排播放,并且与帧相比的时间戳不正确。 Opencv的播放速度将非常缓慢,直到遇到一个断点,它将跳过几帧,然后迅速播放几帧并赶上VLC中的正常视频。这种方法似乎效率很低,但是可以确保框架对齐(如果可行)。
因为视频和csv时间戳均为30fps,所以我认为我可以正常播放视频并每帧增加csv索引以获得相应的输出。但是,当比较这些时间戳时,opencv会慢慢超过csv,并且到视频结尾时要提前数分钟。
# This changes over time!! About 1 milliscond every 3 frames
diff = timeToMilli(csv['Time'][index]) - cap.get(0)
# Returns 30 as expected
fps = cap.get(5)
以这种方式播放视频,在视觉上也比在VLC中观看视频要快。
在python opencv中将视频回放与时间戳同步的任何想法吗? opencv的运行速度是否超过30fps?还是可能是某种编码问题。