Пример #1
0
def main(args):
    scene_manager = SceneManager(args.input_folder)
    scene_manager.load_images()

    images = sorted(scene_manager.images.itervalues(),
                    key=lambda image: image.name)

    save_camera_ply(args.output_file, images, args.scale)
Пример #2
0
def main(args):
    scene_manager = SceneManager(args.input_folder)
    scene_manager.load()

    image_ids = map(scene_manager.get_image_from_name,
                    iter(lambda: sys.stdin.readline().strip(), ""))
    scene_manager.delete_images(image_ids)

    scene_manager.save(args.output_folder)
Пример #3
0
def main(args):
    scene_manager = SceneManager(args.input_folder)
    scene_manager.load_cameras()
    scene_manager.load_images()

    if args.sort:
        images = sorted(scene_manager.images.itervalues(),
                        key=lambda im: im.name)
    else:
        images = scene_manager.images.values()

    fid = open(args.output_file, "w")
    fid_filenames = open(args.output_file + ".list.txt", "w")

    print >> fid, "# Bundle file v0.3"
    print >> fid, len(images), 0

    for image in images:
        print >> fid_filenames, image.name
        camera = scene_manager.cameras[image.camera_id]
        print >> fid, 0.5 * (camera.fx + camera.fy), 0, 0
        R, t = image.R(), image.t
        print >> fid, R[0, 0], R[0, 1], R[0, 2]
        print >> fid, -R[1, 0], -R[1, 1], -R[1, 2]
        print >> fid, -R[2, 0], -R[2, 1], -R[2, 2]
        print >> fid, t[0], -t[1], -t[2]

    fid.close()
    fid_filenames.close()
Пример #4
0
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)))
Пример #5
0
def main(args):
    scene_manager = SceneManager(args.input_folder)
    scene_manager.load()

    images = sorted(scene_manager.images.itervalues(), key=image_to_idx)

    if args.method.lower() == "linear":
        new_images = interpolate_linear(images, args.camera_id, args.format)
    else:
        new_images = interpolate_hermite(images, args.camera_id, args.format)

    map(scene_manager.add_image, new_images)

    scene_manager.save(args.output_folder)
Пример #6
0
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)
Пример #7
0
def main(args):
    scene_manager = SceneManager(args.input_folder)
    scene_manager.load()
    assert (len(scene_manager.cameras) == 4)

    zed_l = "frame_chess_zed_left_"
    zed_r = "frame_chess_zed_right_"
    zed_count = 0

    for image in scene_manager.images.itervalues():
        if zed_l in image.name:
            zed_count = zed_count + 1

    zed_gt_scale_in_meters = 0.120
    zed_diff_vec = np.zeros((zed_count, 3))

    for image in scene_manager.images.itervalues():
        if zed_l in image.name:
            row_id = int(image.name.split(zed_l, 1)[1][:-4])
            if row_id < zed_count:
                zed_diff_vec[row_id] = zed_diff_vec[row_id] + image.C()

        if zed_r in image.name:
            row_id = int(image.name.split(zed_r, 1)[1][:-4])
            if row_id < zed_count:
                zed_diff_vec[row_id] = zed_diff_vec[row_id] - image.C()

    print(np.linalg.norm(zed_diff_vec, axis=1))
    scale = zed_gt_scale_in_meters / np.median(
        np.linalg.norm(zed_diff_vec, axis=1))

    print("Scaling the model by {}".format(scale))
    scene_manager.points3D[:] = scene_manager.points3D[:] * scale
    for image in scene_manager.images.itervalues():
        image.tvec = image.tvec * scale

    # Print the relative transform from camera 1 to camera 2. [R|t]
    ricoh_image_l_name = "frame_chess_left_{}.png".format(str(0).zfill(4))
    ricoh_image_r_name = "frame_chess_right_{}.png".format(str(0).zfill(4))

    #ricoh_image_l_name = "cubemap_left_cam_001_{}.png".format(str(0).zfill(4))
    #ricoh_image_r_name = "cubemap_right_cam_001_{}.png".format(str(0).zfill(4))

    for image in scene_manager.images.itervalues():
        if ricoh_image_l_name == image.name:
            ricoh_image_l = image

        if ricoh_image_r_name == image.name:
            ricoh_image_r = image

    print("Relative transformation is:")
    rel_pose = np.matmul(ricoh_image_r.Pose(), ricoh_image_l.InvPose())
    np.set_printoptions(suppress=True)
    print(rel_pose)
    print("\nRelative transformation inverse is:")
    print(np.linalg.inv(rel_pose))

    scene_manager.save(args.output_folder)

    # Save rel_pose in the ini settings format.
    pose_save_str = "\n[RicohRelativePose]"
    pose_save_str = pose_save_str + "\nextrinsics = [ " + np.array2string(
        rel_pose, precision=10, separator=';', suppress_small=False).replace(
            "]", "").replace("[", "").replace("\n", "") + " ]"
    pose_save_str = pose_save_str + "\ninput_path =  " + args.input_folder
    pose_save_str = pose_save_str + "\noutput_path =  " + args.output_folder
    pose_save_str = pose_save_str + "\n"

    with open(os.path.join(args.output_folder, "extrinsics.ini"),
              "w") as text_file:
        text_file.write(pose_save_str)
Пример #8
0
def main(args):
    suffix = ".photometric.bin" if args.photometric else ".geometric.bin"

    image_file = os.path.join(args.dense_folder, "images", args.image_filename)
    depth_file = os.path.join(args.dense_folder, args.stereo_folder,
                              "depth_maps", args.image_filename + suffix)
    if args.save_normals:
        normals_file = os.path.join(args.dense_folder, args.stereo_folder,
                                    "normal_maps",
                                    args.image_filename + suffix)

    # load camera intrinsics from the COLMAP reconstruction
    scene_manager = SceneManager(os.path.join(args.dense_folder, "sparse"))
    scene_manager.load_cameras()
    scene_manager.load_images()

    image_id, image = scene_manager.get_image_from_name(args.image_filename)
    camera = scene_manager.cameras[image.camera_id]
    rotation_camera_from_world = image.R()
    camera_center = image.C()

    # load image, depth map, and normal map
    image = imageio.imread(image_file)

    with open(depth_file, "rb") as fid:
        w = int("".join(iter(lambda: fid.read(1), "&")))
        h = int("".join(iter(lambda: fid.read(1), "&")))
        c = int("".join(iter(lambda: fid.read(1), "&")))
        depth_map = np.fromfile(fid, np.float32).reshape(h, w)
        if (h, w) != image.shape[:2]:
            depth_map = zoom(
                depth_map,
                (float(image.shape[0]) / h, float(image.shape[1]) / w),
                order=0)

    if args.save_normals:
        with open(normals_file, "rb") as fid:
            w = int("".join(iter(lambda: fid.read(1), "&")))
            h = int("".join(iter(lambda: fid.read(1), "&")))
            c = int("".join(iter(lambda: fid.read(1), "&")))
            normals = np.fromfile(fid,
                                  np.float32).reshape(c, h,
                                                      w).transpose([1, 2, 0])
            if (h, w) != image.shape[:2]:
                normals = zoom(
                    normals,
                    (float(image.shape[0]) / h, float(image.shape[1]) / w, 1.),
                    order=0)

    if args.min_depth is not None:
        depth_map[depth_map < args.min_depth] = 0.
    if args.max_depth is not None:
        depth_map[depth_map > args.max_depth] = 0.

    # create 3D points
    #depth_map = np.minimum(depth_map, 100.)
    points3D = np.dstack(camera.get_image_grid() + [depth_map])
    points3D[:, :, :2] *= depth_map[:, :, np.newaxis]

    # save
    points3D = points3D.astype(np.float32).reshape(-1, 3)
    if args.save_normals:
        normals = normals.astype(np.float32).reshape(-1, 3)
    image = image.reshape(-1, 3)
    if image.dtype != np.uint8:
        if image.max() <= 1:
            image = (image * 255.).astype(np.uint8)
        else:
            image = image.astype(np.uint8)

    if args.world_space:
        points3D = points3D.dot(rotation_camera_from_world) + camera_center
        if args.save_normals:
            normals = normals.dot(rotation_camera_from_world)

    if args.save_normals:
        vertices = np.rec.fromarrays(tuple(points3D.T) + tuple(normals.T) +
                                     tuple(image.T),
                                     names="x,y,z,nx,ny,nz,red,green,blue")
    else:
        vertices = np.rec.fromarrays(tuple(points3D.T) + tuple(image.T),
                                     names="x,y,z,red,green,blue")
    vertices = PlyElement.describe(vertices, "vertex")
    PlyData([vertices]).write(args.output_filename)