File size: 4,252 Bytes
211b431
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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)