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()
输出视频帧数:
如您所见,捕获的帧是3
、5
和7
。
在 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()
输出视频帧数:
如您所见,捕获的帧是3
、5
和7
。