2017-03-31 219 views
3

我有一个有〜8000帧的视频(.mp4)。我有一个csv,告诉我需要抓取视频中每个帧的时间以及要抓取的帧数。 number_of_frames in video = 8000 times是一个数组像[0.004, 0.005, ... 732s] 在给出的数据中的最后一次是在732s。因此FPS = 8000/732 = ~10使用opencv和python或moviepy提取图像

我希望能够在这些特定时间从视频中提取图像帧。然后将这些图像路径写入.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], 
      }) 

但是这种方法也不能工作,由于某种原因,我捕捉视频数百倍的最后一帧。

回答

2

此代码确定在不同的时间提取帧:

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变量的内容?

相关问题