|
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) |
|
|