我是 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!!!")
提前致谢。