# coding: utf-8 import os from glob import glob import os.path as osp import imageio import numpy as np import cv2; cv2.setNumThreads(0); cv2.ocl.setUseOpenCL(False) 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) return [image for idx, 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, n=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] # ajust the size of the image according to the maximum dimension 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)) # ensure that the image dimensions are multiples of n n = max(n, 1) new_h = img.shape[0] - (img.shape[0] % n) new_w = img.shape[1] - (img.shape[1] % n) if new_h == 0 or new_w == 0: # when the width or height is less than n, no need to process 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 # Resize image to satisfy constraints img = resize_to_limit(img, max_dim=max_dim, n=n) if mode.lower() == "bgr": return contiguous(img) elif mode.lower() == "rgb": return contiguous(img[..., ::-1]) else: raise Exception(f"Unknown mode {mode}")