File size: 1,455 Bytes
c165cd8 |
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 |
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()
# expect each line of input corresponds to one row
P = np.array([
map(float, sys.stdin.readline().strip().split()) for _ in xrange(3)])
scene_manager.points3D[:] = scene_manager.points3D.dot(P[:,:3].T) + P[:,3]
# get rotation without any global scaling (assuming isotropic scaling)
scale = np.cbrt(np.linalg.det(P[:,:3]))
q_old_from_new = ~Quaternion.FromR(P[:,:3] / scale)
for image in scene_manager.images.itervalues():
image.q *= q_old_from_new
image.tvec = scale * image.tvec - image.R().dot(P[:,3])
scene_manager.save(args.output_folder)
#-------------------------------------------------------------------------------
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(
description="Apply a 3x4 transformation matrix to a COLMAP model and "
"save the result as a new model. Row-major input can be piped in from "
"a file or entered via the command line.",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("input_folder")
parser.add_argument("output_folder")
args = parser.parse_args()
main(args)
|