用opencv改变视频帧的问题

wnavrhmk  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(133)

我有一个代码,在过去几个月内运行没有任何问题。该代码显示了从视频图像与相关数据库的额外数据。使用键盘,你可以跳过一些帧,并获得更好的见解。然而,在上周改变视频的帧停止工作。
我写了一个小脚本来说明这个问题。

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_COUNTCAP_PROP_POS_MSEC,没有任何缺失,尽管msec标志确实给出了给予非零的结果,这毫无意义。
还有一点很重要,我是在一个docker文件中构建这个应用程序的,我没有使用特定的版本来满足我的需求。这里的测试是用opencv-python==4.7.0.68。此外,视频在VLC上播放时工作正常。
我在网上寻找最近类似的问题,除了这个github issue,没有发现太多类似的问题,我开始一个一个地降级opencv,没有任何运气。
也许这里有人可以帮助解决这个问题,或者给予我做一些不同的事情。

vyswwuz2

vyswwuz21#

使用Opencv 4.5.4在Python 3.8.10上测试了代码

在mp4文件上运行原始代码得到以下输出:

输出

before = 1.0 after = 31.0
before = 32.0 after = 62.0
before = 63.0 after = 93.0
before = 94.0 after = 124.0
before = 125.0 after = 155.0
before = 156.0 after = 181.0

我也可以通过改变来一帧一帧地进行:

cap_rgb.set(cv2.CAP_PROP_POS_FRAMES, before + 30.0)

cap_rgb.set(cv2.CAP_PROP_POS_FRAMES, before)

输出:

before = 1.0 after = 1.0
before = 2.0 after = 2.0
before = 3.0 after = 3.0
before = 4.0 after = 4.0
before = 5.0 after = 5.0
etc..

您可能可以绕过错误的方法是:

before = cap_rgb.get(cv2.CAP_PROP_POS_FRAMES)
if before==0:
    before+=1
else:
   cap_rgb.set(cv2.CAP_PROP_POS_FRAMES, start_frame)

否则,它看起来可能只是你的OpenCV版本的问题。

相关问题