|
import os |
|
|
|
import cv2 |
|
import imageio |
|
import numpy as np |
|
|
|
|
|
def video_to_frame(video_path: str, |
|
frame_dir: str, |
|
filename_pattern: str = 'frame%03d.jpg', |
|
log: bool = True, |
|
frame_edit_func=None): |
|
os.makedirs(frame_dir, exist_ok=True) |
|
|
|
vidcap = cv2.VideoCapture(video_path) |
|
success, image = vidcap.read() |
|
|
|
if log: |
|
print('img shape: ', image.shape[0:2]) |
|
|
|
count = 0 |
|
while success: |
|
if frame_edit_func is not None: |
|
image = frame_edit_func(image) |
|
|
|
cv2.imwrite(os.path.join(frame_dir, filename_pattern % count), image) |
|
success, image = vidcap.read() |
|
if log: |
|
print('Read a new frame: ', success, count) |
|
count += 1 |
|
|
|
vidcap.release() |
|
|
|
|
|
def frame_to_video(video_path: str, frame_dir: str, fps=30, log=True): |
|
|
|
first_img = True |
|
writer = imageio.get_writer(video_path, fps=fps) |
|
|
|
file_list = sorted(os.listdir(frame_dir)) |
|
for file_name in file_list: |
|
if not (file_name.endswith('jpg') or file_name.endswith('png')): |
|
continue |
|
|
|
fn = os.path.join(frame_dir, file_name) |
|
curImg = imageio.imread(fn) |
|
|
|
if first_img: |
|
H, W = curImg.shape[0:2] |
|
if log: |
|
print('img shape', (H, W)) |
|
first_img = False |
|
|
|
writer.append_data(curImg) |
|
|
|
writer.close() |
|
|
|
|
|
def get_fps(video_path: str): |
|
video = cv2.VideoCapture(video_path) |
|
fps = video.get(cv2.CAP_PROP_FPS) |
|
video.release() |
|
return fps |
|
|
|
|
|
def get_frame_count(video_path: str): |
|
video = cv2.VideoCapture(video_path) |
|
frame_count = video.get(cv2.CAP_PROP_FRAME_COUNT) |
|
video.release() |
|
return frame_count |
|
|
|
|
|
def resize_image(input_image, resolution): |
|
H, W, C = input_image.shape |
|
H = float(H) |
|
W = float(W) |
|
k = min(float(resolution) / min(H, W), float(768) / max(H, W)) |
|
H *= k |
|
W *= k |
|
H = int(np.round(H / 64.0)) * 64 |
|
W = int(np.round(W / 64.0)) * 64 |
|
img = cv2.resize( |
|
input_image, (W, H), |
|
interpolation=cv2.INTER_LANCZOS4 if k > 1 else cv2.INTER_AREA) |
|
return img |
|
|
|
|
|
def prepare_frames(input_path: str, output_dir: str, resolution: int, crop): |
|
l, r, t, b = crop |
|
|
|
def crop_func(frame): |
|
H, W, C = frame.shape |
|
left = np.clip(l, 0, W) |
|
right = np.clip(W - r, left, W) |
|
top = np.clip(t, 0, H) |
|
bottom = np.clip(H - b, top, H) |
|
frame = frame[top:bottom, left:right] |
|
return resize_image(frame, resolution) |
|
|
|
video_to_frame(input_path, output_dir, '%04d.png', False, crop_func) |
|
|