使用 Python Photogrammetry Toolbox (PPT) 进行照片3D重建

【原文:http://www.didayin.com/archives/695

之前我们了解了如何使用 VisualSFM 对多张照片进行3D重建。除了 VisualSFM 之外,其实还有其他方法能够完成同样的任务,今天就为大家介绍一下 Python Photogrammetry Toolbox(下称 PPT)。

使用 PPT 进行照片重建,基本步骤与使用 VisualSFM 时相同,分为特征识别、特征匹配、稀疏重建以及稠密重建几步。不过 PPT 通过 Python 脚本语言将 bundle、PMVS 等工具封装了起来,一方面提供了跨平台性,更重要的,整个重建过程可以依靠脚本完成,减少了人工参与的成分。

您需要在下面的网页下载安装 PPT。

http://www.arc-team.homelinux.com/arcteam/ppt.php

如果您按照网页上的介绍,除了 PPT 之外还安装了相应的 GUI,那么重建过程会更直观。我们下面的示例也将使用 GUI。这次用于重建的照片,仍然是 Autodesk 123D Catch 中自带的佛陀,你可以在 123D Catch 安装目录下的 sample_project 中找到这些照片。

1 600x456 使用 Python Photogrammetry Toolbox (PPT) 进行照片3D重建 VisualSFM Python Photogrammetry Toolbox 3D重建

启动 PPT 的 GUI,你将看到主程序界面。

2 600x405 使用 Python Photogrammetry Toolbox (PPT) 进行照片3D重建 VisualSFM Python Photogrammetry Toolbox 3D重建

主界面中有 4 个 tab,常用的是前两个。“1. Run Bundle” 用于识别与匹配图像特征点,“2. Run CMVS/PMVS” 则完成稀疏与稠密重建。

点击 Select Photos Path 后,我们可以在弹出的对话框中选择我们希望重建的照片所在的目录。除了指定照片目录之外,界面中还提供了一些选项。其中 Select Feature Extractor 用于选择特征的抽取方法。不同的抽取方法可能有不同的许可证要求,不过对于我们试用来说区别不大。右侧的选项可以让你对图片进行统一的缩放。每次你改动配置,底部的 Run 中的命令行都会相应更新。

3 600x34 使用 Python Photogrammetry Toolbox (PPT) 进行照片3D重建 VisualSFM Python Photogrammetry Toolbox 3D重建

配置停当后,点击 Run,就可以开始我们重建的第一步了。此时,在 Python 的 Console 中,你可以看到识别以及匹配的过程。

4 使用 Python Photogrammetry Toolbox (PPT) 进行照片3D重建 VisualSFM Python Photogrammetry Toolbox 3D重建

在识别匹配完成后,会自动弹出工作目录,其中保存了各个照片的特征值以及匹配结果。

5 600x494 使用 Python Photogrammetry Toolbox (PPT) 进行照片3D重建 VisualSFM Python Photogrammetry Toolbox 3D重建

我们在主界面中切换到 “2. Run CMVS/PMVS” 标签,在 “Select Bundler Output Path” 中填入之前的工作目录。需要注意的是下面这个选项。

6 使用 Python Photogrammetry Toolbox (PPT) 进行照片3D重建 VisualSFM Python Photogrammetry Toolbox 3D重建

该选项决定了 PMVS 将使用多少张照片重建模型。如果填入的数字小于照片的总数,那么将会得到多个模型,这样你还得手动将这些模型组合起来。因为佛陀的照片一共有 40 张,所以我们直接在这里填入 40。同样的,每次你改变配置,Run 中的命令行都会相应改变。配置完之后,点击 Run,便开始稀疏重建了。与在 VisualSFM 中一样,这一步非常耗费 CPU,所以请在空闲时运行。

7 使用 Python Photogrammetry Toolbox (PPT) 进行照片3D重建 VisualSFM Python Photogrammetry Toolbox 3D重建

经过一段时间等待之后,刚才的工作目录中会多出现 pmvs 的目录,重建的结果就在其中。

8 600x494 使用 Python Photogrammetry Toolbox (PPT) 进行照片3D重建 VisualSFM Python Photogrammetry Toolbox 3D重建

打开 models 下的 ply 文件,我们就又可以看到我们熟悉的佛陀朋友了。

9 600x394 使用 Python Photogrammetry Toolbox (PPT) 进行照片3D重建 VisualSFM Python Photogrammetry Toolbox 3D重建

到这里我们已经得到了模型的点云。其后的根据点云重建多边形的步骤,与使用 VisualSFM 时相同,这里就不再介绍了。

总的来说,PPT 的重建结果与 VisualSFM 区别不大,不过 Python 的便利性还是提供了很多二次开发的可能性,如果你有什么好主意,欢迎交流哦!


### 关于Python中实现连续法相对定向 在摄影测量学领域,连续法相对定向是一种用于确定两张或多张影像之间相对位置和姿态的方法。这种方法通常应用于立体像对处理过程中,在已知同名点的情况下求解两幅图像之间的相对方位元素。 对于基于Python的连续法相对定向实现,虽然直接提供完整代码较为复杂,因为这涉及到多个步骤和技术细节,但可以概述其主要流程并给出部分核心代码片段作为参考: #### 数据准备阶段 首先需要获取至少一对具有重叠区域的图像,并从中提取出可靠的特征点及其描述子。这些工作可以通过OpenCV库来高效完成。 ```python import cv2 def extract_features(image_path): img = cv2.imread(image_path, 0) sift = cv2.SIFT_create() keypoints, descriptors = sift.detectAndCompute(img, None) return keypoints, descriptors ``` #### 特征匹配环节 利用FLANN或BFMatcher算法来进行快速而精准的特征匹配操作,从而找到多组有效的同名点对。 ```python from sklearn.neighbors import NearestNeighbors def match_features(descriptors1, descriptors2): matcher = NearestNeighbors(n_neighbors=2).fit(descriptors2) distances, indices = matcher.kneighbors(descriptors1) good_matches = [] ratio_threshold = 0.75 for i, (m,n) in enumerate(zip(*indices.T)): if distances[i][0] < ratio_threshold * distances[i][1]: good_matches.append((i, m)) return good_matches ``` #### 基础矩阵计算 根据上述获得的同名点集,采用八点法或其他方法估计基础矩阵F,该矩阵反映了两个视角间几何关系的本质属性。 ```python import numpy as np def compute_fundamental_matrix(points1, points2): A = [] for pt1, pt2 in zip(points1, points2): u1,v1 = pt1[:2] u2,v2 = pt2[:2] row = [u2*u1, v2*u1, u1, u2*v1, v2*v1, v1, u2, v2, 1] A.append(row) _,_,Vt = np.linalg.svd(np.array(A)) F = Vt[-1].reshape(3,3) U,D,Vt = np.linalg.svd(F) D[-1]=0 F = U @ np.diag(D) @ Vt return F / F[2,2] ``` #### 相对位姿恢复 最后一步是从基础矩阵推导出本质矩阵E,并进一步分解得到旋转和平移参数,进而构建相机外参矩阵R,t,此过程可能涉及奇异值分解(SVD)[^1]。 值得注意的是,以上仅展示了简化版的工作流框架;实际应用时还需考虑更多因素如异常值剔除、尺度一致性校正等。此外,也可以借助开源软件包如OpenMVG/OpenMVS或是前述提到过的Photogrammetry Toolbox(PPT),它们内部已经实现了更为成熟稳定的解决方案[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值