IsshikiHugh's picture
feat: CPU demo
5ac1897
raw
history blame
3.14 kB
import imageio
import numpy as np
from tqdm import tqdm
from typing import Union, List
from pathlib import Path
from glob import glob
from .edit import flex_resize_img, flex_resize_video
def load_img_meta(
img_path : Union[str, Path],
):
''' Read the image meta from the given path without opening image. '''
assert Path(img_path).exists(), f'Image not found: {img_path}'
H, W = imageio.v3.improps(img_path).shape[:2]
meta = {'w': W, 'h': H}
return meta
def load_img(
img_path : Union[str, Path],
mode : str = 'RGB',
):
''' Read the image from the given path. '''
assert Path(img_path).exists(), f'Image not found: {img_path}'
img = imageio.v3.imread(img_path, plugin='pillow', mode=mode)
meta = {
'w': img.shape[1],
'h': img.shape[0],
}
return img, meta
def save_img(
img : np.ndarray,
output_path : Union[str, Path],
resize_ratio : Union[float, None] = None,
**kwargs,
):
''' Save the image. '''
assert img.ndim == 3, f'Invalid image shape: {img.shape}'
if resize_ratio is not None:
img = flex_resize_img(img, ratio=resize_ratio)
imageio.v3.imwrite(output_path, img, **kwargs)
def load_video(
video_path : Union[str, Path],
):
''' Read the video from the given path. '''
if isinstance(video_path, str):
video_path = Path(video_path)
assert video_path.exists(), f'Video not found: {video_path}'
if video_path.is_dir():
print(f'Found {video_path} is a directory. It will be regarded as a image folder.')
imgs_path = sorted(glob(str(video_path / '*')))
frames = []
for img_path in tqdm(imgs_path):
frames.append(imageio.imread(img_path))
fps = 30 # default fps
else:
print(f'Found {video_path} is a file. It will be regarded as a video file.')
reader = imageio.get_reader(video_path, format='FFMPEG')
frames = []
for frame in tqdm(reader, total=reader.count_frames()):
frames.append(frame)
fps = reader.get_meta_data()['fps']
frames = np.stack(frames, axis=0) # (L, H, W, 3)
meta = {
'fps': fps,
'w' : frames.shape[2],
'h' : frames.shape[1],
'L' : frames.shape[0],
}
return frames, meta
def save_video(
frames : Union[np.ndarray, List[np.ndarray]],
output_path : Union[str, Path],
fps : float = 30,
resize_ratio : Union[float, None] = None,
quality : Union[int, None] = None,
):
''' Save the frames as a video. '''
if isinstance(frames, List):
frames = np.stack(frames, axis=0)
assert frames.ndim == 4, f'Invalid frames shape: {frames.shape}'
if resize_ratio is not None:
frames = flex_resize_video(frames, ratio=resize_ratio)
Path(output_path).parent.mkdir(parents=True, exist_ok=True)
writer = imageio.get_writer(output_path, fps=fps, quality=quality)
output_seq_name = str(output_path).split('/')[-1]
for frame in tqdm(frames, desc=f'Saving {output_seq_name}'):
writer.append_data(frame)
writer.close()