python - 使用 opencv 和 python 或 moviepy 提取图像

标签 python opencv video extraction moviepy

我有一个大约有 8000 帧的视频 (.mp4)。我有一个 csv,它告诉我需要在视频中抓取每一帧的时间,以及要抓取的帧数。 视频中的 number_of_frames = 8000 times 是一个数组,如 [0.004, 0.005, ... 732s] 给出的数据中最后一次是在 732s。因此 FPS = 8000/732 = ~10

我希望能够在那些特定时间从视频中提取图像帧。然后将这些图像路径写入 .csv 文件。

我尝试了多种方法: 第一种方法(openCV):

with open('./data/driving.csv', 'w') as csvfile:
fieldnames = ['image_path', 'time', 'speed']
writer = csv.DictWriter(csvfile, fieldnames = fieldnames)
writer.writeheader()
vidcap = cv2.VideoCapture('./data/drive.mp4')
for idx, item in enumerate(ground_truth):
    # set video capture to specific time frame
    # multiply time by 1000 to convert to milliseconds
    vidcap.set(cv2.CAP_PROP_POS_MSEC, item[0] * 1000)
    # read in the image
    success, image = vidcap.read()
    if success:
        image_path = os.path.join('./data/IMG/', str(item[0]) + 
     '.jpg')
        # save image to IMG folder
        cv2.imwrite(image_path, image)
        # write row to driving.csv
        writer.writerow({'image_path': image_path, 
                 'time':item[0],
                 'speed':item[1],
                })

然而,这种方法并没有给我所需的总帧数。它只是给了我对应于 FPS = 25 的视频的帧数。我相信我的 FPS = 8000/732s = 10.928s。

然后我尝试使用 moviepy 以类似的风格捕捉每张图像:

from moviepy.editor import VideoFileClip
clip1 = VideoFileClip('./data/drive.mp4')
with open('./data/driving.csv', 'w') as csvfile:
    fieldnames = ['image_path', 'time', 'speed']
    writer = csv.DictWriter(csvfile, fieldnames = fieldnames)
    writer.writeheader()

    # Path to raw image folder
    abs_path_to_IMG = os.path.join('./data/IMG/')
    for idx, item in enumerate(ground_truth):
      image_path = os.path.join('./data/IMG/', str(item[0]) + '.jpg')
      clip1.save_frame(image_path, t = item[0])
      # write row to driving.csv
      writer.writerow({'image_path': image_path, 
             'time':item[0],
             'speed':item[1],
            })

但是这种方法也不起作用,出于某种原因,我捕获了视频中的最后一帧数百次。

最佳答案

此代码可以在不同时间提取帧:

import os
from moviepy.editor import *

def extract_frames(movie, times, imgdir):
    clip = VideoFileClip(movie)
    for t in times:
        imgpath = os.path.join(imgdir, '{}.png'.format(t))
        clip.save_frame(imgpath, t)

movie = 'movie.mp4'
imgdir = 'frames'
times = 0.1, 0.63, 0.947, 1.2, 3.8, 6.7

extract_frames(movie, times, imgdir)

ground_truth 变量的内容是什么?

关于python - 使用 opencv 和 python 或 moviepy 提取图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43148590/

相关文章:

python - 导入错误 : no module named py2exe

python - 将来自相机的帧写入 OpenCV 中的单个图像

javascript - 在一个js函数中使用多个具有多个类的视频

python - 如何安装特定版本的 conda 软件包?

python - 具有开始和结束条件的序列的长度(计数)Python

python - 使用 Python 从视频中提取文本

qt - 第一个qt-opencv程序

android - 我们如何在 Android 中查找视频是否包含音频

html - MP4 html5 视频无法在 IE10 上运行

python - 如何将 recaptcha 自定义主题与 Flask-WTF 一起使用