forked from rmbrualla/pycolmap
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcolmap_to_nvm.py
69 lines (52 loc) · 2.43 KB
/
colmap_to_nvm.py
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
import itertools
import sys
sys.path.append("..")
import numpy as np
from pycolmap import Quaternion, SceneManager
#-------------------------------------------------------------------------------
def main(args):
scene_manager = SceneManager(args.input_folder)
scene_manager.load()
with open(args.output_file, "w") as fid:
fid.write("NVM_V3\n \n{:d}\n".format(len(scene_manager.images)))
image_fmt_str = " {:.3f} " + 7 * "{:.7f} "
for image_id, image in scene_manager.images.iteritems():
camera = scene_manager.cameras[image.camera_id]
f = 0.5 * (camera.fx + camera.fy)
fid.write(args.image_name_prefix + image.name)
fid.write(image_fmt_str.format(
*((f,) + tuple(image.q.q) + tuple(image.C()))))
if camera.distortion_func is None:
fid.write("0 0\n")
else:
fid.write("{:.7f} 0\n".format(-camera.k1))
image_id_to_idx = dict(
(image_id, i) for i, image_id in enumerate(scene_manager.images))
fid.write("{:d}\n".format(len(scene_manager.points3D)))
for i, point3D_id in enumerate(scene_manager.point3D_ids):
fid.write(
"{:.7f} {:.7f} {:.7f} ".format(*scene_manager.points3D[i]))
fid.write(
"{:d} {:d} {:d} ".format(*scene_manager.point3D_colors[i]))
keypoints = [
(image_id_to_idx[image_id], kp_idx) +
tuple(scene_manager.images[image_id].points2D[kp_idx])
for image_id, kp_idx in
scene_manager.point3D_id_to_images[point3D_id]]
fid.write("{:d}".format(len(keypoints)))
fid.write(
(len(keypoints) * " {:d} {:d} {:.3f} {:.3f}" + "\n").format(
*itertools.chain(*keypoints)))
#-------------------------------------------------------------------------------
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(
description="Save a COLMAP reconstruction in the NVM format "
"(http://ccwu.me/vsfm/doc.html#nvm).",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("input_folder")
parser.add_argument("output_file")
parser.add_argument("--image_name_prefix", type=str, default="",
help="prefix image names with this string (e.g., 'images/')")
args = parser.parse_args()
main(args)