Spaces:
Runtime error
Runtime error
Download util/interactive_util.py from Lim-Kevin/VideoInpainterHF: direct link, hf CLI and curl.
- Browser
- Download file 3.69 kB
-
https://huggingface.co/spaces/Lim-Kevin/VideoInpainterHF/resolve/main/util/interactive_util.py
- Command line
-
hf download hf://spaces/Lim-Kevin/VideoInpainterHF/util/interactive_util.py
-
curl -L -o interactive_util.py https://huggingface.co/spaces/Lim-Kevin/VideoInpainterHF/resolve/main/util/interactive_util.py
3.69 kB
| import os | |
| from io import BytesIO | |
| import cv2 | |
| import numpy as np | |
| from PIL import Image | |
| from moviepy.video.io.VideoFileClip import VideoFileClip | |
| def convert_to_mp4(file_path): | |
| """ | |
| Converts a saved video file to mp4 and deletes the original file | |
| :param file_path: The path to the video | |
| :return: The filename with a mp4 ending | |
| """ | |
| video_name, extension = os.path.splitext(file_path) | |
| # Return if file is already an mp4 | |
| if extension == '.mp4': | |
| return file_path | |
| video = VideoFileClip(file_path) | |
| output_filepath = video_name + '.mp4' | |
| video.write_videofile(output_filepath) | |
| video.close() | |
| os.remove(file_path) # Delete original file | |
| return output_filepath | |
| def reduce_fps(file_path, target_fps=30): | |
| video = VideoFileClip(file_path) | |
| video_name, extension = os.path.splitext(file_path) | |
| if video.fps > target_fps: | |
| output_path = video_name + '_' + str(target_fps) + extension | |
| video.set_fps(target_fps).write_videofile(output_path, fps=target_fps, codec='libx264') | |
| video.close() | |
| os.remove(file_path) # Delete original file | |
| return output_path | |
| else: | |
| return file_path | |
| def resize_and_save_frames(video_path, output_folder, new_height=360): | |
| """ | |
| Saves every frame of an uploaded video | |
| :param video_path: Path from root to the video | |
| :param output_folder: Path from root to the folder that should contain the frames | |
| """ | |
| os.makedirs(output_folder, exist_ok=True) | |
| cap = cv2.VideoCapture(video_path) | |
| frame_count = 0 | |
| while cap.isOpened(): | |
| ret, frame = cap.read() | |
| if ret: | |
| original_height, original_width = frame.shape[:2] | |
| # Resize frame | |
| if original_height > new_height: | |
| aspect_ratio = original_width / original_height | |
| new_width = int(aspect_ratio * new_height) | |
| resized_frame = cv2.resize(frame, (new_width, new_height)) | |
| else: | |
| resized_frame = frame | |
| frame_path = os.path.join(output_folder, '{:05}.png'.format(frame_count)) | |
| cv2.imwrite(frame_path, resized_frame) | |
| frame_count += 1 | |
| else: | |
| break | |
| cap.release() | |
| cv2.destroyAllWindows() | |
| def get_video_info(video_path): | |
| """ | |
| :param video_path: Path from root to the video | |
| :return: Number of frames and fps of a video | |
| """ | |
| video = cv2.VideoCapture(video_path) | |
| if not video.isOpened(): | |
| print("Error: Unable to open video.") | |
| return None | |
| num_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT)) | |
| fps = video.get(cv2.CAP_PROP_FPS) | |
| video.release() | |
| return num_frames, fps | |
| def array_to_bytesio(image_array): | |
| # Convert the NumPy array to an image | |
| image = Image.fromarray(image_array) | |
| # Create a BytesIO object to store the image data | |
| img_io = BytesIO() | |
| # Save the image to the BytesIO object in PNG format | |
| image.save(img_io, 'PNG') | |
| img_io.seek(0) | |
| return img_io | |
| def compose_mask(mask): | |
| """ | |
| Makes an image where the mask is colored and slightly transparent | |
| :param mask: a 1-channel image with 1 where the mask is | |
| :return: the composed mask as an array | |
| """ | |
| color_map = [ | |
| [0, 0, 0], | |
| [255, 0, 0], | |
| [0, 255, 0], | |
| [0, 0, 255], | |
| [255, 0, 255], | |
| [0, 255, 255], | |
| [255, 255, 0], | |
| ] | |
| color_map_np = np.array(color_map) | |
| colored_image = np.zeros((mask.shape[0], mask.shape[1], 4), dtype=np.uint8) | |
| for i in range(len(color_map)): | |
| colored_image[mask == i, :3] = color_map_np[i] | |
| colored_image[mask >= 1, 3] = 128 | |
| return colored_image | |