Spaces:
Running
on
Zero
Running
on
Zero
import math | |
import pandas as pd | |
import cv2 | |
import os | |
def extract_frames(video_path, sampled_path, frame_interval, residual=False): | |
try: | |
video_name = os.path.splitext(os.path.basename(video_path))[0] | |
cap = cv2.VideoCapture(video_path) | |
frames = [] | |
if not cap.isOpened(): | |
print(f"Error: Could not open video file {video_path}") | |
return frames | |
frame_count = 0 | |
saved_frame_count = 0 | |
while True: | |
ret, frame = cap.read() | |
if not ret: | |
break | |
if (frame_count % frame_interval == 0 and not residual) or ( | |
(frame_count - 1) % frame_interval == 0 and residual): | |
# suffix = '_next' if residual else '' | |
# output_filename = os.path.join(sampled_path, f'{video_name}_{saved_frame_count + 1}{suffix}.png') | |
# cv2.imwrite(output_filename, frame) | |
frames.append(frame) | |
saved_frame_count += 1 | |
frame_count += 1 | |
cap.release() | |
frame_type = 'next frames' if residual else 'sampled frames' | |
print(f'Extraction of {frame_type} for {video_name} completed!') | |
return frames | |
except Exception as e: | |
print(f"An unexpected error occurred: {e}") | |
def process_video_residual(video_type, video_name, framerate, video_path, sampled_path): | |
if not os.path.exists(sampled_path): | |
os.makedirs(sampled_path) | |
# cap = cv2.VideoCapture(video_path) | |
# framerate = cap.get(cv2.CAP_PROP_FPS) | |
# print(f'framerate: {framerate}') | |
frame_interval = math.ceil(framerate / 2) if framerate < 2 else int(framerate / 2) | |
# print(f'Frame interval: {frame_interval}') | |
frames = extract_frames(video_path, sampled_path, frame_interval, residual=False) | |
frames_next = extract_frames(video_path, sampled_path, frame_interval, residual=True) | |
return frames, frames_next | |
if __name__ == '__main__': | |
video_type = 'test' | |
if video_type == 'test': | |
ugcdata = pd.read_csv("../../metadata/test_videos.csv") | |
for i in range(len(ugcdata)): | |
video_name = ugcdata['vid'][i] | |
framerate = ugcdata['framerate'][i] | |
print(f'Processing video: {video_name}, framerate: {framerate}') | |
video_path = f"../../ugc_original_videos/{video_name}.mp4" | |
sampled_path = f'../../video_sampled_frame/original_sampled_frame/{video_name}/' | |
if not os.path.exists(sampled_path): | |
os.makedirs(sampled_path) | |
print(f'{video_name}') | |
frames, frames_next = process_video_residual(video_type, video_name, framerate, video_path, sampled_path) | |
print(f'Extracted {len(frames)} frames and {len(frames_next)} residual frames for video: {video_name}') |