ReLaX-VQA / extractor /vf_extract.py
xinyiW915's picture
Upload 5 files
79e0f15 verified
raw
history blame contribute delete
2.84 kB
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}')