在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
谢谢。
发布于 2022-04-09 08:30:27
您将获得帧[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()输出视频帧:



如您所见,捕获的帧是3、5和7。
https://stackoverflow.com/questions/71801632
复制相似问题