|
import subprocess
|
|
from pathlib import Path
|
|
import cv2
|
|
import pandas as pd
|
|
import os
|
|
import numpy as np
|
|
|
|
def convert_to_mp4(input_path, output_path, data_name):
|
|
os.environ['PATH'] += os.pathsep + r"C:\Users\um20242\ffmpeg\bin"
|
|
if data_name == 'live_qualcomm':
|
|
command = ['ffmpeg.exe', '-hide_banner', '-loglevel', 'error',
|
|
'-s', f'1920x1080', '-pix_fmt', 'yuv420p', '-framerate', '25.0',
|
|
'-i', str(input_path), '-c:v', 'libx264', '-preset', 'fast', '-c:a', 'aac', '-y',
|
|
str(output_path)]
|
|
else:
|
|
command = ['ffmpeg.exe', '-i', str(input_path), '-c:v', 'libx264', '-preset', 'fast', '-c:a', 'aac', '-y', str(output_path)]
|
|
try:
|
|
subprocess.run(command, check=True)
|
|
print(f"success: {output_path}")
|
|
return True
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"error: {e}")
|
|
return False
|
|
|
|
def is_greyscale_image(image):
|
|
if len(image.shape) == 2:
|
|
return True
|
|
elif len(image.shape) == 3 and image.shape[2] == 3:
|
|
b, g, r = image[:, :, 0], image[:, :, 1], image[:, :, 2]
|
|
color_threshold = 3
|
|
if (cv2.norm(b - g, cv2.NORM_INF) <= color_threshold and
|
|
cv2.norm(b - r, cv2.NORM_INF) <= color_threshold and
|
|
cv2.norm(g - r, cv2.NORM_INF) <= color_threshold):
|
|
return True
|
|
return False
|
|
|
|
def check_video_greyscale(video_path):
|
|
cap = cv2.VideoCapture(str(video_path))
|
|
if not cap.isOpened():
|
|
print(f"Cannot open video file: {video_path}")
|
|
return False, False
|
|
|
|
frame_read = False
|
|
while True:
|
|
ret, frame = cap.read()
|
|
if not ret:
|
|
break
|
|
frame_read = True
|
|
if not is_greyscale_image(frame):
|
|
cap.release()
|
|
return False, True
|
|
|
|
cap.release()
|
|
|
|
return True if frame_read else False, frame_read
|
|
|
|
def process_videos_from_csv(metadata_path, output_csv, data_name):
|
|
df = pd.read_csv(metadata_path)
|
|
results = []
|
|
for i, row in df.iterrows():
|
|
frame_read = True
|
|
if data_name == 'youtube_ugc':
|
|
video_path = Path("D:/video_dataset/ugc-dataset/youtube_ugc/original_videos") / f"{row['resolution']}P" / f"{row['vid']}.mkv"
|
|
elif data_name == 'konvid_1k':
|
|
video_path = Path("D:/video_dataset/KoNViD_1k/KoNViD_1k_videos") / f"{row['vid']}.mp4"
|
|
elif data_name == 'lsvq_train' or data_name == 'lsvq_test' or data_name == 'lsvq_test_1080P':
|
|
video_path = Path("D:/video_dataset/LSVQ") / f"{row['vid']}.mp4"
|
|
elif data_name == 'live_vqc':
|
|
video_path = Path("D:/video_dataset/LIVE-VQC/video") / f"{row['vid']}.mp4"
|
|
elif data_name == 'live_qualcomm':
|
|
video_path = Path("D:/video_dataset/LIVE-Qualcomm") / f"{row['vid']}.yuv"
|
|
elif data_name == 'cvd_2014':
|
|
video_path = Path("D:/video_dataset/CVD2014") / f"{row['vid']}.avi"
|
|
|
|
converted_path = video_path.with_suffix('.mp4')
|
|
need_conversion = data_name == 'live_qualcomm' or not frame_read
|
|
|
|
if need_conversion:
|
|
convert_to_mp4(video_path, converted_path, data_name)
|
|
is_greyscale, frame_read = check_video_greyscale(converted_path)
|
|
os.remove(converted_path)
|
|
else:
|
|
is_greyscale, frame_read = check_video_greyscale(video_path)
|
|
|
|
|
|
if is_greyscale:
|
|
print(video_path)
|
|
results.append({'Index': i, 'vid': row['vid'], 'Is Greyscale': is_greyscale})
|
|
|
|
if len(results) != 0:
|
|
result_df = pd.DataFrame(results)
|
|
result_df.to_csv(output_csv, index=False)
|
|
print(f"results saved to {output_csv}")
|
|
else:
|
|
print('no greyscale video')
|
|
|
|
if __name__ == '__main__':
|
|
data_name = 'live_qualcomm'
|
|
metadata_path = f'../../metadata/{data_name.upper()}_metadata.csv'
|
|
greyscale_path = f'../../metadata/greyscale_report/{data_name.upper()}_greyscale_metadata.csv'
|
|
|
|
process_videos_from_csv(metadata_path, greyscale_path, data_name)
|
|
|