File size: 2,796 Bytes
10dcc2e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import sys
assert sys.version_info >= (3, 7), 'ordered dict is required'
import os
import argparse
import re

from tqdm import tqdm


def read_images_meta(images_txt_path):
    images_meta = {}
    with open(images_txt_path, "r") as fid:
        line = fid.readline()
        assert line == '# Image list with two lines of data per image:\n'
        line = fid.readline()
        assert line == '#   IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME\n'
        line = fid.readline()
        assert line == '#   POINTS2D[] as (X, Y, POINT3D_ID)\n'
        line = fid.readline()
        assert re.search('^# Number of images: \d+, mean observations per image: [-+]?\d*\.\d+|\d+\n$', line)
        num_images, mean_ob_per_img = re.findall(r"[-+]?\d*\.\d+|\d+", line)
        num_images = int(num_images)
        mean_ob_per_img = float(mean_ob_per_img)

        for _ in tqdm(range(num_images), desc='reading images meta'):
            l = fid.readline()
            elems = l.split()
            image_id = int(elems[0])
            l2 = fid.readline()
            images_meta[image_id] = [l, l2]
    return images_meta


def read_header(images_txt_path):
    header = []
    with open(images_txt_path, "r") as fid:
        line = fid.readline()
        assert line == '# Image list with two lines of data per image:\n'
        header.append(line)
        line = fid.readline()
        assert line == '#   IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME\n'
        header.append(line)
        line = fid.readline()
        assert line == '#   POINTS2D[] as (X, Y, POINT3D_ID)\n'
        header.append(line)
        line = fid.readline()
        assert re.search('^# Number of images: \d+, mean observations per image: [-+]?\d*\.\d+|\d+\n$', line)
        header.append(line)
    return header


def export_images_txt(save_to, header, content):
    assert not os.path.isfile(save_to), 'you are overriding existing files'
    with open(save_to, "w") as fid:
        for l in header:
            fid.write(l)
        for k, item in content.items():
            for l in item:
                fid.write(l)


def main(opt):
    reference = read_images_meta(opt.reference_images_txt)
    unordered = read_images_meta(opt.unordered_images_txt)
    ordered = {}
    for k in reference.keys():
        ordered[k] = unordered[k]
    header = read_header(opt.unordered_images_txt)
    export_images_txt(opt.save_to, header, ordered)


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument('--reference_images_txt', type=str, default=None, required=True)
    parser.add_argument('--unordered_images_txt', type=str, default=None, required=True)
    parser.add_argument('--save_to', type=str, default=None, required=True)
    opt = parser.parse_args()
    main(opt)