2017-03-31 16 views
3

~ 8000 프레임의 비디오 (.mp4)가 있습니다. 나는 비디오에서 각 프레임을 잡아야하는 시간과 잡아 줄 프레임의 수를 알려주는 CSV 파일을 가지고있다. number_of_frames in video = 8000 번은 같은 배열입니다 [0.004, 0.005, ... 732s] 주어진 데이터의 마지막 시간은 732 초입니다. 따라서 FPS = 8000/732 = ~10opencv 및 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 변수의 내용은 무엇입니까?