|
|
|
|
|
import os
|
|
from glob import glob
|
|
import os.path as osp
|
|
import imageio
|
|
import numpy as np
|
|
import pickle
|
|
import cv2; cv2.setNumThreads(0); cv2.ocl.setUseOpenCL(False)
|
|
|
|
from .helper import mkdir, suffix
|
|
|
|
|
|
def load_image_rgb(image_path: str):
|
|
if not osp.exists(image_path):
|
|
raise FileNotFoundError(f"Image not found: {image_path}")
|
|
img = cv2.imread(image_path, cv2.IMREAD_COLOR)
|
|
return cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
|
|
|
|
|
|
def load_driving_info(driving_info):
|
|
driving_video_ori = []
|
|
|
|
def load_images_from_directory(directory):
|
|
image_paths = sorted(glob(osp.join(directory, '*.png')) + glob(osp.join(directory, '*.jpg')))
|
|
return [load_image_rgb(im_path) for im_path in image_paths]
|
|
|
|
def load_images_from_video(file_path):
|
|
reader = imageio.get_reader(file_path, "ffmpeg")
|
|
return [image for _, image in enumerate(reader)]
|
|
|
|
if osp.isdir(driving_info):
|
|
driving_video_ori = load_images_from_directory(driving_info)
|
|
elif osp.isfile(driving_info):
|
|
driving_video_ori = load_images_from_video(driving_info)
|
|
|
|
return driving_video_ori
|
|
|
|
|
|
def contiguous(obj):
|
|
if not obj.flags.c_contiguous:
|
|
obj = obj.copy(order="C")
|
|
return obj
|
|
|
|
|
|
def resize_to_limit(img: np.ndarray, max_dim=1920, division=2):
|
|
"""
|
|
ajust the size of the image so that the maximum dimension does not exceed max_dim, and the width and the height of the image are multiples of n.
|
|
:param img: the image to be processed.
|
|
:param max_dim: the maximum dimension constraint.
|
|
:param n: the number that needs to be multiples of.
|
|
:return: the adjusted image.
|
|
"""
|
|
h, w = img.shape[:2]
|
|
|
|
|
|
if max_dim > 0 and max(h, w) > max_dim:
|
|
if h > w:
|
|
new_h = max_dim
|
|
new_w = int(w * (max_dim / h))
|
|
else:
|
|
new_w = max_dim
|
|
new_h = int(h * (max_dim / w))
|
|
img = cv2.resize(img, (new_w, new_h))
|
|
|
|
|
|
division = max(division, 1)
|
|
new_h = img.shape[0] - (img.shape[0] % division)
|
|
new_w = img.shape[1] - (img.shape[1] % division)
|
|
|
|
if new_h == 0 or new_w == 0:
|
|
|
|
return img
|
|
|
|
if new_h != img.shape[0] or new_w != img.shape[1]:
|
|
img = img[:new_h, :new_w]
|
|
|
|
return img
|
|
|
|
|
|
def load_img_online(obj, mode="bgr", **kwargs):
|
|
max_dim = kwargs.get("max_dim", 1920)
|
|
n = kwargs.get("n", 2)
|
|
if isinstance(obj, str):
|
|
if mode.lower() == "gray":
|
|
img = cv2.imread(obj, cv2.IMREAD_GRAYSCALE)
|
|
else:
|
|
img = cv2.imread(obj, cv2.IMREAD_COLOR)
|
|
else:
|
|
img = obj
|
|
|
|
|
|
img = resize_to_limit(img, max_dim=max_dim, division=n)
|
|
|
|
if mode.lower() == "bgr":
|
|
return contiguous(img)
|
|
elif mode.lower() == "rgb":
|
|
return contiguous(img[..., ::-1])
|
|
else:
|
|
raise Exception(f"Unknown mode {mode}")
|
|
|
|
|
|
def load(fp):
|
|
suffix_ = suffix(fp)
|
|
|
|
if suffix_ == "npy":
|
|
return np.load(fp)
|
|
elif suffix_ == "pkl":
|
|
return pickle.load(open(fp, "rb"))
|
|
else:
|
|
raise Exception(f"Unknown type: {suffix}")
|
|
|
|
|
|
def dump(wfp, obj):
|
|
wd = osp.split(wfp)[0]
|
|
if wd != "" and not osp.exists(wd):
|
|
mkdir(wd)
|
|
|
|
_suffix = suffix(wfp)
|
|
if _suffix == "npy":
|
|
np.save(wfp, obj)
|
|
elif _suffix == "pkl":
|
|
pickle.dump(obj, open(wfp, "wb"))
|
|
else:
|
|
raise Exception("Unknown type: {}".format(_suffix))
|
|
|