CV2 cap.set(1,idx); cap.read(),它读取的是Frame idx还是Frame idx+1

CV2 cap.set(1,idx); cap.read(), Does it Read Frame idx or Frame idx+1

在 CV2 中,这段代码会读取给定帧编号的帧还是下一帧?

desiredFrames = [3,5,7,n]
cap = cv2.VideoCapture("somefile")

for idx in desiredFrames:
    cap.set(cv2.CAP_PROP_POS_FRAMES,idx);
    cap.read() #Does it Read Frame idx or Frame idx+1

所以我会得到帧 [3,5,7,n] 或帧 [4,6,8,n+1]

谢谢。

您将获得帧[3, 5, 7, n](视频文件中第一帧的索引为0)。

我们可以通过简单的测试来证明。
首先使用 FFmpeg CLI 构建合成模式视频文件。
(模式的)每一帧都包含一个从零开始计数的帧计数器。

为了在python中使用FFmpeg,FFmpeg可执行文件应该在执行路径中(我们也可以使用完整路径)。

构建示例文件:

sp.run(shlex.split('ffmpeg -y -f lavfi -i testsrc=size=128x72:rate=1:duration=10 somefile.mp4'))

将 MP4 视频帧转换为 PNG 图像序列:

sp.run(shlex.split('ffmpeg -i somefile.mp4 somefile_frame%03d.png'))

这里是前5帧图片(我们可以看到每一帧都有一个从0开始的帧计数器):


测试desiredFrames = [3, 5, 7]

这里是构建输入视频文件的“自包含”代码示例,查找第 3、5、7 帧,显示帧并保存为 PNG 图像:

import cv2
import subprocess as sp
import shlex

# Build sample video file for testing (suing FFmpeg CLI).
# The test pattern includes a frame counter that start from 0.
sp.run(shlex.split('ffmpeg -y -f lavfi -i testsrc=size=128x72:rate=1:duration=10 somefile.mp4'))
sp.run(shlex.split('ffmpeg -i somefile.mp4 somefile_frame%03d.png'))

desiredFrames = [3, 5, 7]

cap = cv2.VideoCapture("somefile.mp4")

for idx in desiredFrames:
    cap.set(cv2.CAP_PROP_POS_FRAMES, idx);
    _, frame = cap.read()  # Does it Read Frame idx or Frame idx+1?

    cv2.imshow('frame', frame)  # Show the frame for testing
    cv2.waitKey(1000)

    cv2.imwrite(f'frame{idx}.png', frame)  # Save the frame t PNG file for testing

cap.release()
cv2.destroyAllWindows()

输出视频帧数:

如您所见,捕获的帧是357