def save_triangles_in_ply_file(output_path_to_file, triangles):
        logger.info('save_triangles_in_ply_file: ...')
        points = []
        faces = []
        for triangle_index, triangle in enumerate(triangles):
            assert isinstance(triangle.vertex_0, np.ndarray) \
                   and isinstance(triangle.vertex_1, np.ndarray) \
                   and isinstance(triangle.vertex_2,np.ndarray)

            # FIXME this will result in duplicated points (in the ply file)
            points += [
                Point(triangle.vertex_0),
                Point(triangle.vertex_1),
                Point(triangle.vertex_2)
            ]
            # FIXME these face indices refer to duplicated points
            faces.append(
                Face(initial_indices=[
                    3 * triangle_index, 3 * triangle_index +
                    1, 3 * triangle_index + 2
                ]))

        PLYFileHandler.write_ply_file(ofp=output_path_to_file,
                                      vertices=points,
                                      faces=faces)

        logger.info('save_triangles_in_ply_file: Done')
    def save_single_triangle_in_ply_file(output_path_to_file, corner_0,
                                         corner_1, corner_2):
        assert isinstance(corner_0, np.ndarray) and \
               isinstance(corner_1, np.ndarray) and \
               isinstance(corner_2, np.ndarray)
        points = [Point(corner_0), Point(corner_1), Point(corner_2)]

        # the first 3 points are building the triangle
        faces = [Face(initial_indices=[0, 1, 2])]

        PLYFileHandler.write_ply_file(ofp=output_path_to_file,
                                      vertices=points,
                                      faces=faces)
Beispiel #3
0
 def set_dense_points_from_ply(self, input_path_to_ply_file):
     logger.info('set_dense_points_from_ply: ...')
     assert self.dense_points is None
     dense_points, _ = PLYFileHandler.parse_ply_file(input_path_to_ply_file)
     if len(dense_points) > 0:
         self.dense_points = dense_points
     logger.info('set_dense_points_from_ply: Done')
Beispiel #4
0
    def write_reconstruction_file(cameras, points, ofp_or_odp):

        if os.path.splitext(ofp_or_odp)[1] == '.ply':
            PLYFileHandler.write_ply_file(
                ofp=ofp_or_odp,
                vertices=points)

        # TODO ADD Other file formats

        else:   # If no file format matches, convert to colmap
            # NOTE: IN COLMAP ONLY POINTS WITH MORE THAN 3 MEASUREMENTS ARE SHOWN BY DEFAULT
            # (CAN BE CHANGED IN THE VIEWER SETTINGS)
            ColmapFileHandler.create_colmap_model_files(
                ofp_or_odp,
                cameras,
                points,
                number_camera_models=1)
    def save_rectangle_in_ply_file(output_path_to_file, corner_0, corner_1,
                                   corner_2, corner_3):
        assert isinstance(corner_0, np.ndarray) and \
               isinstance(corner_1, np.ndarray) and \
               isinstance(corner_2, np.ndarray) is isinstance(corner_3, np.ndarray)
        points = [
            Point(corner_0),
            Point(corner_1),
            Point(corner_2),
            Point(corner_3)
        ]

        # represent the rectangle by 2 triangles
        face_1 = Face(initial_indices=[0, 1, 2])
        face_2 = Face(initial_indices=[3, 2, 1])
        faces = [face_1, face_2]

        PLYFileHandler.write_ply_file(ofp=output_path_to_file,
                                      vertices=points,
                                      faces=faces)
def write_camera_centers_as_ply(camera_object_trajectory,
                                camera_trajectory_ply_file_path):
    camera_centers = []
    for frame_name in camera_object_trajectory.get_frame_names_sorted():
        cam = camera_object_trajectory.get_camera(frame_name)

        if cam.is_monocular_cam():
            camera_centers.append(cam.get_camera_center())
        else:
            camera_centers.append(cam.get_left_camera().get_camera_center())
            camera_centers.append(cam.get_right_camera().get_camera_center())

    camera_center_points = []
    for center in camera_centers:
        camera_center_points.append(Point(coord=center, color=(0, 255, 0)))

    PLYFileHandler.write_ply_file(
        ofp=camera_trajectory_ply_file_path,
        vertices=camera_center_points,
        plain_text_output=True)  # Binary output does only work
Beispiel #7
0
    def parse_reconstruction_file(ifp):

        if os.path.splitext(ifp)[1] == '.nvm':
            cameras, points = NVMFileHandler.parse_nvm_file(ifp)
        elif os.path.splitext(ifp)[1] == '.ply':
            points, faces = PLYFileHandler.parse_ply_file(ifp)
            cameras = []
        else:
            logger.vinfo('ext', os.path.splitext(ifp)[1])
            logger.info('Input file type Not implemented yet')
            assert False

        return cameras, points
Beispiel #8
0
def import_ply_as_point_cloud(object_fps, get_index_str_of_ply, prefix=None, point_scale_factor=1):

    index_str_to_obj = OrderedDict()
    for object_fp in object_fps:
        logger.info('Importing ' + str(object_fp))

        index_str = get_index_str_of_ply(object_fp)
        obj_name = prefix + index_str

        points, _ = PLYFileHandler.parse_ply_file(object_fp)
        point_obj_names = PointCloudTool.add_point_cloud_using_dupliverts(
            points,
            add_meshes_at_vertex_positions=True,
            mesh_type=VertexType.CUBE,
            mesh_scale=point_scale_factor)

        bpy.context.scene.objects.active = bpy.data.objects[obj_name]

        index_str_to_obj[index_str] = bpy.data.objects[obj_name]

    return index_str_to_obj
Beispiel #9
0
                    data_tuple)

            if data_semantics.pseudo_color:
                factor = 255
            else:
                factor = 1

            for data_tuple in lines_as_tuples:
                point = Point()

                point.coord = [
                    float(data_tuple[data_semantics.x_idx]),
                    float(data_tuple[data_semantics.y_idx]),
                    float(data_tuple[data_semantics.z_idx])
                ]
                point.color = [
                    int(factor * float(data_tuple[data_semantics.r_idx])),
                    int(factor * float(data_tuple[data_semantics.g_idx])),
                    int(factor * float(data_tuple[data_semantics.b_idx]))
                ]
                points.append(point)
        return points


points = PointDataFileHandler.parse_asc_or_pts_or_csv(
    '/mnt/DataHDD/PythonBlenderAddons/Blender-Addon-Photogrammetry-Importer/examples/Example/Example.csv',
    delimiter=',',
    only_data=True)
PLYFileHandler.write_ply_file(
    '/mnt/DataHDD/PythonBlenderAddons/Blender-Addon-Photogrammetry-Importer/examples/Example/Example.ply',
    points)