0

我是 python 新手,我正在尝试使用 OpenCV 中的 python 对象的一系列图像来实现 Motion 管道中的结构。我已经实现了几乎整个管道,但现在我无法在 MS 的 3DViewer 应用程序中可视化 3d 对象(.OBJ 文件)(我的 PC 运行速度太慢,无法运行 Meshlab)。在应用程序的统计部分,当我打开 .obj 文件时,它说我有 0 个三角形和 0 个顶点。任何人都可以帮助我从 3d 点数组正确创建一个 .OBJ 文件。

这是我创建带有顶点的 .OBJ 文件的代码:

def write_obj(self, mesh_v, filepath):
    """
    Saves 3d points which can be read in meshlab
    """
    print("adding new 3D points to OBJ file...")

    with open(filepath, 'a') as fp:
        for v in mesh_v:
            fp.write('v %f %f %f\n' % (v[0], v[1], v[2]))

这是我实现 SfM 管道的主要功能:

 def run(self):

    print("Starting the task...")

    self.load_images()

    # pair processing
    for i in range(len(self.imgs)-1):
        # step 1 and 2: detect and match feature
        p1, p2, matches_good, kp1, kp2 = self.detect_and_match_feature(
            self.imgs[i], self.imgs[i+1])

        self.visualize_matches(
            self.imgs[i], self.imgs[i+1], kp1, kp2, matches_good,
            save_path=join(self.output_dir, 'sift_match'+str(i)+'.png'))

        # step 3: compute essential matrix
        E, mask = self.compute_essential(p1, p2)

        self.visualize_matches(
            self.imgs[i], self.imgs[i+1], kp1, kp2, matches_good, mask=mask,
            save_path=join(self.output_dir, 'inlier_match'+str(i)+'.png'))

        self.visualize_epipolar_lines(
            self.imgs[i], self.imgs[i+1], p1, p2, E,
            save_path=join(self.output_dir, 'epipolar_lines'+str(i)+'.png'))

        # step 4: recover pose
        R, trans = self.compute_pose(p1, p2, E)

        # step 5: triangulation
        point_3d = self.triangulate(p1, p2, R, trans, mask)
        self.write_obj(point_3d, filepath=join(
            self.output_dir, 'output.obj'))
    
    print("Task completed!!!")

提前致谢。

4

0 回答 0