首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CV2 cap.set(1,idx);cap.read(),它读取帧idx还是帧idx+1?

CV2 cap.set(1,idx);cap.read(),它读取帧idx还是帧idx+1?
EN

Stack Overflow用户
提问于 2022-04-08 18:22:15
回答 1查看 222关注 0票数 0

在CV2中,这段代码会读取给定帧号或下一个帧的帧吗?

代码语言:javascript
复制
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

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-09 08:30:27

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

我们可以通过一个简单的测试来证明这一点。

从使用FFmpeg CLI构建合成模式视频文件开始。

每个帧(模式)包括一个从零开始计数的帧计数器。

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

构建示例文件:

代码语言:javascript
复制
sp.run(shlex.split('ffmpeg -y -f lavfi -i testsrc=size=128x72:rate=1:duration=10 somefile.mp4'))

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

代码语言:javascript
复制
sp.run(shlex.split('ffmpeg -i somefile.mp4 somefile_frame%03d.png'))

下面是作为图像的前5个帧(我们可以看到每个帧都有一个从0开始的帧计数器):

测试desiredFrames = [3, 5, 7]

下面是一个构建输入视频文件、寻求帧3、5、7、显示框架并保存到PNG图像的“自包含”代码示例:

代码语言:javascript
复制
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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71801632

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档