용도 :
동영상에서 이미지를 뽑아내고싶을때
동영상의 일정한 프레임마다 이미지를 생성하고싶을때 사용하면된다.
과정
온라인사이트에서 사용할때는 제약이있고 내 동영상파일이 유출될? 우려가 있다.
온라인에서 돌아다니는 프로그램을 받으면 바이러스우려나 부속프로그램이 깔리는게 불편하다.
그래서 github을 돌아다니며 찾았다.
사용언어 : Python
소스코드 (Python)
import argparse
import os
import cv2
import time
from datetime import date
import glob
parser = argparse.ArgumentParser()
parser.add_argument('--input_path', type=str, default='', help='input video file\'s path')
parser.add_argument('--output_path', type=str, default='', help='output video file\'s path')
parser.add_argument('--video_type', type=str, default='avi,mp4,mpg,mpeg,mov', help='available video\'s type')
parser.add_argument('--fps', type=int, default=1, help='extract frame per second from video')
args = parser.parse_args()
def extract_frame(file_path):
file_name_ext = os.path.basename(file_path)
file_name = file_name_ext.split('.')[0]
output_path = os.path.join(file_path.replace('/' + file_name_ext, ""), 'result/')
if not os.path.exists(output_path):
print('% % % % % % % % % make result directory % % % % % % % % %')
os.mkdir(output_path)
video = cv2.VideoCapture(file_path)
video_fps = int(video.get(cv2.CAP_PROP_FPS))
video_length = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
video_length_one = 1
if video_length > 100:
video_length_one = int(video_length / 100)
video_save_fps = int(video_fps / args.fps)
extract_today = date.today().strftime('%m%d')
start = time.time()
success = True
count = 1
save_count = 1
while success:
success, image = video.read()
if success:
if count % video_save_fps == 0:
cv2.imwrite(os.path.join(output_path, ('%s_%s_frame%05d.jpg'
% (extract_today, file_name, save_count))), image)
save_count += 1
if count % video_length_one == 0:
print('########## progress ------ %s (fps: %d) ------ %7.2f%% (%6d/%6d) ------------------ ##########'
% (file_name_ext, video_fps, count / video_length * 100, count, video_length), end='\r')
count += 1
else:
print('########## progress ------ %s (fps: %d) ------ %7.2f%% (%6d/%6d) ------------------ ##########'
% (file_name_ext, video_fps, (count - 1) / video_length * 100, count - 1, video_length), end='\r')
print('@@@@@@@@@@ complete ------ %s (fps: %d, frames: %6d) -->> image\'s count: %6d ------ %0.2f sec @@@@@@@@@@'
% (file_name, video_fps, video_length, save_count, time.time() - start), end='\r')
print()
if __name__ == '__main__':
video_type_list = args.video_type.split(',')
if os.path.isfile(args.input_path):
extract_frame(args.input_path)
elif os.path.isdir(args.input_path):
input_path = sorted(glob.glob(os.path.join(args.input_path, '*.*')))
for f in input_path:
if f.split('.')[-1] in video_type_list:
extract_frame(f)
else:
print('% % % % % % % % % no file or directory % % % % % % % % %')
- --input_path
- you should use directory path (contains video files) or video file path
- 비디오 파일이 있는 디렉토리의 경로나 비디오 파일의 경로를 입력해야 합니다.
- after my code check input path, extract video files
- 코드에서 input_path를 확인한 후, 비디오 파일들을 이미지로 전환합니다.
- --video_type
- You can set the possible extensions for the files in the directory or the video files.
- 디렉토리 내 파일이나 비디오 파일에 대해 가능한 확장자를 설정할 수 있습니다.
- default='avi,mp4,mpg,mpeg,mov'
- --fps
- this parameter means frame per second from video files.
- 해당 파라미터는 비디오 파일로부터 초당 몇 프레임을 추출할 것인지를 의미합니다.
example1) parameter fps = 1, video file(fps 30) every 1s -> save 1 image
example2) parameter fps = 3, video file(fps 30) every 1s -> save 3 image
- default=1
출처
'R&D' 카테고리의 다른 글
딥러닝을 통한 이미지생성과 슈퍼샘플링 (0) | 2022.04.29 |
---|---|
포토모자이크 기법 (0) | 2022.03.28 |
[WebRTC] 웹 화면공유, 화상회의 (0) | 2021.11.03 |
오픈소스 한글 입력 문제 (0) | 2021.10.08 |
댓글