我有一个代码,在过去几个月内运行没有任何问题。该代码显示了从视频图像与相关数据库的额外数据。使用键盘,你可以跳过一些帧,并获得更好的见解。然而,在上周改变视频的帧停止工作。
我写了一个小脚本来说明这个问题。
import cv2
vid_cap_reader_path = "vid_230830_122746_C.avi"
cap_rgb = cv2.VideoCapture(vid_cap_reader_path)
k = 0
while 1:
if k == ord("q"):
break
if k == ord("b"):
before = cap_rgb.get(cv2.CAP_PROP_POS_FRAMES)
cap_rgb.set(cv2.CAP_PROP_POS_FRAMES, before + 30.0)
after = cap_rgb.get(cv2.CAP_PROP_POS_FRAMES)
print(f"before = {before} after = {after}")
ret, img = cap_rgb.read()
if ret:
cv2.imshow("bla", img)
k = cv2.waitKey(0)
else:
break
这是打印到终端的内容:
[mpeg4 @ 0x1d87400] warning: first frame is no keyframe
before = 36.0 after = 0.0
before = 67.0 after = 0.0
[mpeg4 @ 0x1d87400] warning: first frame is no keyframe
before = 40.0 after = 0.0
[mpeg4 @ 0x1d87400] warning: first frame is no keyframe
视频本身并没有像预期的那样“跳”到下一帧,opencv的大多数属性也返回0。我还测试了CAP_PROP_FRAME_COUNT
和CAP_PROP_POS_MSEC
,没有任何缺失,尽管msec标志确实给出了给予非零的结果,这毫无意义。
还有一点很重要,我是在一个docker文件中构建这个应用程序的,我没有使用特定的版本来满足我的需求。这里的测试是用opencv-python==4.7.0.68
。此外,视频在VLC上播放时工作正常。
我在网上寻找最近类似的问题,除了这个github issue,没有发现太多类似的问题,我开始一个一个地降级opencv,没有任何运气。
也许这里有人可以帮助解决这个问题,或者给予我做一些不同的事情。
1条答案
按热度按时间vyswwuz21#
使用Opencv 4.5.4在Python 3.8.10上测试了代码
在mp4文件上运行原始代码得到以下输出:
输出
我也可以通过改变来一帧一帧地进行:
到
输出:
您可能可以绕过错误的方法是:
否则,它看起来可能只是你的OpenCV版本的问题。