将单个视频转成图片
参数
- -i: 视频文件地址
- -o: 图片输出文件夹地址
- -f: 抽取帧数跨步
代码
核心就是cv2模块,先cv2.VideoCapture
读取视频,然后通过cv对象的read()来获取每一个视频画面帧,进行进行存储等操作。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import cv2
import os
import argparse
import glob
import time
from common import init_logger, output_log
import shutil
'''
将单个视频文件转换成图片
'''
ROOT_DIR = os.path.abspath(os.path.dirname(__file__))
FILE_NAME = os.path.basename(__file__)[:-3]
def make_parser():
parser = argparse.ArgumentParser(description="将视频转换成图片")
parser.add_argument("-i", "--input", dest="input_path", required=True, help="待转换的视频或者视频目录", type=str)
parser.add_argument("-o", "--output", dest="output_dir", required=True, help="输出目录", type=str)
parser.add_argument("-f", "--frequency", dest="frequency", help="抽取祯的频度, 例如:当指定为10时,则抽取第10、20、30祯,...,依次类推", default=10, type=int)
return parser
def save_frames(video_file, output_path, frequency):
start_ms = int(time.time() * 1000)
video_name = os.path.basename(video_file)[:-4]
output_dir = os.path.join(output_path, video_name)
if os.path.exists(output_dir):
shutil.rmtree(output_dir)
os.makedirs(output_dir)
cap = cv2.VideoCapture(video_file)
index = 0
while True:
flag, frame = cap.read()
if flag:
index += 1
if(index % frequency == 0):
# frame = frame[:, 1304:]
path = os.path.join(output_dir, "%s_%04d.jpg" % (video_name, index))
output_log(path)
cv2.imencode('.jpg', frame)[1].tofile(path)
else:
break
cap.release()
cv2.destroyAllWindows()
end_ms = int(time.time() * 1000)
output_log("save_frames %s finished in %d ms" % (video_file, end_ms - start_ms))
def video_2_image(video_file, output_dir, frequency):
if video_file.lower().endswith((".mkv", ".mp4", ".avi", ".mov")):
save_frames(video_file, output_dir, frequency)
def main():
init_logger(os.path.join(ROOT_DIR, FILE_NAME + '.log'))
parser = make_parser()
args = vars(parser.parse_args())
input_path = args["input_path"]
output_dir = args["output_dir"]
frequency = args["frequency"]
output_log("input_path: %s" % input_path)
output_log("output_dir: %s" % output_dir)
output_log("frequency: %d" % frequency)
if os.path.isdir(input_path):
for p in sorted(glob.glob(input_path + "/*.*")):
video_2_image(p, output_dir, frequency)
elif os.path.isfile(input_path):
video_2_image(input_path, output_dir, frequency)
if __name__ == '__main__':
main()