File size: 3,875 Bytes
6e2dee6
 
 
 
 
 
 
 
b6bd9ea
6e2dee6
 
 
 
 
 
 
 
 
 
 
 
 
b6bd9ea
6e2dee6
 
 
 
 
 
 
 
 
 
 
 
b6bd9ea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6e2dee6
 
 
 
 
 
 
 
b6bd9ea
6e2dee6
 
 
 
 
 
 
b6bd9ea
 
 
 
6e2dee6
 
 
b6bd9ea
 
 
 
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
104
105
106
107
108
109
110
111
112
import numpy as np
import cv2
import glob
from pathlib import Path
from matplotlib import pyplot as plt

from rescale import *
from slid import detect_lines
from laps import LAPS
from llr import LLR, llr_pad

RAW_DATA_FOLDER = './data/raw/games/'
PREPROCESSED_FOLDER = './data/preprocessed/games/'


def preprocess_image(path, final_folder="", filename="",  save=False):
    res = cv2.imread(path)[..., ::-1]
    for _ in range(2):
        img, shape, scale = image_resize(res)
        lines = detect_lines(img)
        lattice_points = LAPS(img, lines)
        inner_points = LLR(img, lattice_points, lines)
        four_points = llr_pad(inner_points, img)
        try:
            res = crop(res, four_points, scale)
        except:
            print("WARNING: couldn't crop around outer points")
            res = crop(
                res, inner_points, scale)
    if save:
        Path(final_folder).mkdir(parents=True, exist_ok=True)
        plt.imsave("%s/%s" % (final_folder, filename), res)
    return res


def preprocess_single_image(game_name, version, image_number):
    raw_path = RAW_DATA_FOLDER + '%s/%s/%i.*' % (game_name, version, image_number)
    final_folder = PREPROCESSED_FOLDER + "%s/%s/" % (game_name, version)
    
    matching_files = glob.glob(raw_path)
    
    if not matching_files:
        print(f"ERROR: No image found at {raw_path}")
        return False
    
    if len(matching_files) > 1:
        print(f"WARNING: Multiple files found, using first one: {matching_files[0]}")
    
    path = matching_files[0]
    print(f"Processing: {path}")
    
    try:
        preprocess_image(path, final_folder=final_folder,
                        filename="%i.png" % image_number, save=True)
        print(f"✓ Successfully saved to {final_folder}{image_number}.png")
        return True
    except Exception as e:
        print(f"✗ ERROR processing image: {e}")
        import traceback
        traceback.print_exc()
        return False


def preprocess_multiple_images(images_list):
    total = len(images_list)
    success = 0
    failed = []
    
    print(f"Processing {total} images...")
    for game_name, version, img_num in images_list:
        print(f"\n[{success + len(failed) + 1}/{total}] {game_name}/{version}/image {img_num}")
        if preprocess_single_image(game_name, version, img_num):
            success += 1
        else:
            failed.append((game_name, version, img_num))
    
    print(f"\n{'='*50}")
    print(f"Summary: {success}/{total} images processed successfully")
    if failed:
        print(f"Failed images ({len(failed)}):")
        for game, ver, num in failed:
            print(f"  - {game}/{ver}/image {num}")


def preprocess_games(game_list):
    for game_name in game_list:
        for ver in ['orig', 'rev']:
            img_filename_list = []
            folder_name = RAW_DATA_FOLDER + '%s/%s/*' % (game_name, ver)
            for path_name in glob.glob(folder_name):
                img_filename_list.append(path_name)

            final_folder = PREPROCESSED_FOLDER + "%s/%s/" % (game_name, ver)
            count = 0
            img_filename_list.sort(key=lambda s: int(
                s.split('/')[-1].split('.')[0]))
            for path in img_filename_list:
                count += 1
                preprocess_image(path, final_folder=final_folder,
                                 filename="%i.png" % count, save=True)
            if count > 0:
                print("Done saving in %s." % final_folder)
            else:
                print("No images found in %s" % folder_name)


if __name__ == '__main__':
    # deja fait: carlsen_anand_2014, carlsen_gukesh_2025 vachier-lagrave_carlsen_2023 david_vachier-lagrave_2014
    # game_list = ['david_vachier-lagrave_2014']
    # preprocess_games(game_list)
    preprocess_single_image('vachier-lagrave_carlsen_2023', 'rev', 57)