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