【问题标题】:How can I extract a frame from a video with cv2 at a specific time in microseconds?如何在特定时间(以微秒为单位)从带有 cv2 的视频中提取帧?
【发布时间】:2020-04-28 16:39:04
【问题描述】:

我有一些视频需要抓取并存储为 png 图像。
我只需要特定时间的帧。
这些时间以微秒为单位。
我怎样才能只抓取这些帧?

ret, frame = cap.read()
cv2.imshow("Video", frame)

cap = cv2.VideoCapture("video.mp4")
count = 0
while vidcap.isOpened():

if count == int(308608300 / 1000000):
    cv2.imwrite(os.path.join(path_output_dir, '%d.png') % count)

cv2.destroyAllWindows()

【问题讨论】:

  • 有什么理由不使用ffmpeg
  • “任何不只使用 ffmpeg 的理由”我需要它在 Python 中发生,因为它从 txt 文件中读取并将内容放在不同的文件夹中,并创建文件夹。
  • 感谢@Nicolae 的回答。当我执行success,image = vidcap.read()getvalue = vidcap.get(0) 时,我看到getvalue 每次都返回一个新值。我对这个值是什么以及如何精确定位精确帧的微秒有点迷茫。

标签: python mp4 cv2


【解决方案1】:

这听起来有点像我正在做的事情。因此,对于此代码,只需更改“frameRate”处的数字即可。

import cv2
vidcap = cv2.VideoCapture('video.mp4')
def getFrame(sec):
    vidcap.set(cv2.CAP_PROP_POS_MSEC,sec*1000)
    hasFrames,image = vidcap.read()
    if hasFrames:
        cv2.imwrite("folder/"+str(sec)+" sec.png", image)     # save frame as PNG file
    return hasFrames
sec = 0
frameRate = 0.25#it will capture image in each 0.25 second
success = getFrame(sec)
while success:
    sec = sec + frameRate
    sec = round(sec, 2)
    success = getFrame(sec)

【讨论】:

    猜你喜欢
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多