打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
三维重建 3D reconstruction 有哪些实用算法?

三维重建 3D reconstruction 有哪些实用算法?

按时间排序按投票排序

7 个回答

徐普,数学,计算机,加班
知乎用户、郭申知乎用户 等人赞同
简历发这pu.xu@dji.com
==================================================

我讲一下用一组图片来做3D reconstruction需要的算法吧(SFM), 使用这种方法的软件比较代表性的有 Pix4Dmapper, Autodesk 123D Catch, PhotoModeler, VisualSFM

我用JavaScript撸了个WebSFM, 完全用Javascript实现的3D reconstruction系统,可以在浏览器里跑.


http://websfm.org , 用Chrome,Firefox,IE10+打开即可.

pipeline大致是:
先用SIFT对每张照片提取特征,再对每一对图片做鲁棒的特征匹配,将所有2图匹配合并,找出track,通过tracks估算相机参数场景的稀疏结构, 再用相机参数做dense reconstruction, 输出dense point cloud (with surface nornal)

如果需要,可以用poisson surface reconstruction将dense point cloud转化为polygon

------
SIFT (Scale Invariant Feature Transform)
同样的特征点在不同的scale,方向,光照下都能被检测到,并且理论上会有相同的描述向量. (即invariant)
SIFT有很多变种,但实际上很类似,一般是添加几种可以保持invariant的变换, 比如仿射变换.

一个SIFT特征有四个部分(位置position, 大小scale, 方向direction, 描述向量descriptor).
比较两点可以直接比较其特征向量,不用考虑别的参数.

特征点的position和scale是在DoG Pyramid中找到的extrema.
方向是在特征scale下周边梯度histagram的主导方向.
描述向量是特征scale下以特征方向为准的坐标系下的梯度histagram



lowe's sift: http://www.cs.ubc.ca/~lowe/keypoints/
SiftGPU: SIFT on GPU (siftgpu)
我的JS实现: web-sfm/src/websift at master · ptx-pluto/web-sfm · GitHub

-----
ANN Feature Matching (近似最邻近特征匹配)
找出两张图片之间特征向量的Nearest Neighbor,从而找出点与点之间的匹配关系。
这里输出的匹配是嘈杂的,存在错误, 且非常耗时.

先对两组特征(vs1[], vs2[])分别建立kd-tree
特征有128维,传统的kd-tree效果很差,需要对其进行平衡。在构建kd-tree选择hyperplane的时候,取方差最大的维度,在中位数处split.
为了加快速度,并不寻找严格NN, 而是在kd-tree上寻找ANN(Approximate NN).
匹配是否被采纳并不是使用传统的阀值,而是用一个优先序列来找ANN,最后通过第一与第二的距离比来确定是否采纳。同时v1,v2必须同时互为ANN,匹配(v1,v2)才被采纳.

ann: ANN - Approximate Nearest Neighbor Library
我的JS实现: web-sfm/src/webmatcher at master · ptx-pluto/web-sfm · GitHub

-----
RANSAC:
用RANSAC和八点算法可以将嘈杂的匹配的结果稳定化.

适用情形: dataset存在少量错误,但服从一个constrain,并且constrain可以用dataset的一个很小的子集倒推回去。(在几何中这样的例子很多,比如给你某个平面上1000个点的坐标,但其中有错误数据,其constrain就是这个平面,而平面用3个点就可以确定)

原理: 随机抓一个subset并估算constrain,若subset中有错误数据,该constrain会很不准确,reject大部分数据;相反若subset中恰好都是正确数据,则会得到正确的constrain,accept大部分数据。因此不停的执行这个过程,直到找到正确的constrain,然后判定被其reject的数据为错误数据。(或因尝试次数过多退出)

在这里,dataset就是特征匹配输出的对应关系,而constrain就是核线几何(f-matrix), 用8个对应关系即可用八点算法估算出f-matrix. RANSAC可以筛除不符合核线几何的错误匹配.



RANSAC非常简单,代码只有十几行,而且效果非常明显,肉眼可辨
我的JS实现: web-sfm/ransac.js at master · ptx-pluto/web-sfm · GitHub

------
Eight Point Algorithm (八点算法)
用八个点点对应关系计算核线几何(f-matrix)

两个Projective Camera之间的点点对应关系是需要满足核线几何的,就像三点可以确定一个平面一样,8对匹配可以确定两个相机的核线几何.
核线几何简单的讲就是 x1*F*x2=0 , F是fundamental matrix (3x3, rank 2), x1,x2是相对应的两点的homogenous坐标。
将x1,x2代入后可以得到关于(f1,....f9)的一个线性方程,8对就是8个方程,再用SVD即可得最小二乘解.

------
Bundler Camera Registrtion
用tracks来估算相机参数.

bundler是incremental的,并且依赖于sparse bundle adjustment。初始化第一对相机后,便不断的用已知点估算新相机,并triangulate新的点,直到没有candidate为止,中间不断的做SBA来拟合新的参数, 并且每一轮做一次全局SBA。

bundler: Bundler - Structure from Motion (SfM) for Unordered Image Collections
我的JS实现: web-sfm/register.js at master · ptx-pluto/web-sfm · GitHub

------
SBA (Sparse Bundle Adjustemt)
SBA就是一个为view geometry优化之后的levenberg-marquardt非线性拟合算法. 在最小化projection error的时候,jacobian和hessian矩阵是稀疏的,而且存在特殊规律。利用了稀疏结构之后,就算有几千个变量需要拟合,速度也非常快。下图为sparse jacobian和sparse hessian.



sba: Sparse Bundle Adjustment in C/C++
我的JS实现: web-sfm/sparse-bundle-adjustment.js at master · ptx-pluto/web-sfm · GitHub

-------
CMVS/PMVS (Dense Reconstruction)
使用surfel model的dense reconstruction, 比较复杂, 自己看吧
CMVS/PMVS: CMVS
收藏·没有帮助·· 作者保留权利
刚刚接触视觉这方面,非正规军,说一下我了解的单目视觉三位重建的思路方法吧(仅列举某些…)
1. Optical Flow/Normal Flow
Motion Estimation
Depth
  • 从Normal Flow估计运动参数:D Yuan[2] 有数篇文章发在SCI上(这里给出最新的一篇)
  • 从光流估计运动参数:方法不少,比如[4]
2. SLAM:
3. SfM:
  • SfM我了解的不多,但感觉和SLAM非常相近
  • MLM-SFM[5]: 做车辆自动驾驶相关的,前向运动、车辆探测、距离估计,还是实时的…
  • LIBVISO(Andreas Geiger): 视频youtu.be/EPTJz7w_AqU(这个不知道该归到哪一类,暂且放在SfM里吧)
4. Learning Based:
  • 这类方法应该是用单目相机从单幅图像中估计深度,从一开始的半自动(需要添加特征点、纹理之类的)到现在的全自动,现在用学习的方法越来越多了,譬如:[6]
5. 有个DataSet:The KITTI Vision Benchmark Suite(可以做光流、里程计、vSLAM之类的)

欢迎讨论批评指正,想到了新的东西再更新。

Reference
[1] Davison, Andrew J., et al. "MonoSLAM: Real-time single camera SLAM."Pattern Analysis and Machine Intelligence, IEEE Transactions on 29.6 (2007): 1052-1067.
[2] Engel, Jakob, Thomas Sch?ps, and Daniel Cremers. "LSD-SLAM: Large-scale direct monocular SLAM." Computer Vision–ECCV 2014. Springer International Publishing, 2014. 834-849.
[3] Yuan, Ding, et al. "Camera motion estimation through monocular normal flow vectors." Pattern Recognition Letters 52 (2015): 59-64.
[4] Raudies, Florian, and Heiko Neumann. "An efficient linear method for the estimation of ego-motion from optical flow." Pattern Recognition. Springer Berlin Heidelberg, 2009. 11-20.
[5] Song, Shiyu, and Manmohan Chandraker. "Robust Scale Estimation in Real-Time Monocular SFM for Autonomous Driving." Computer Vision and Pattern Recognition (CVPR), 2014 IEEE Conference on. IEEE, 2014.
[6] Karsch, Kevin, Ce Liu, and S. Kang. "Depthtransfer: Depth extraction from video using non-parametric sampling." (2014): 1-1.
收藏·没有帮助·· 作者保留权利
目前来说“实用”的主要有两类:结构光方法和sfm方法。
结构光方法适合室内高精度重建,目前商业产品已经比较多,相对成熟;
sfm方法比结构光更方便,无需事先标定相机,但精度差些,目前很多用无人机对大型建筑建模就是用的sfm方法。
其它重建方法还有很多,建议找几篇综述看看
收藏·没有帮助·
推荐学习一下 bundle adjustment算法~
收藏·没有帮助·
三维重构算法得看你用什么传感器了,如果是双目相机,那一般都是极线几何加视觉特征配准的算法了,优化就用bundle adjustment。如果是单目,较早的有PTAM,DTAM,近几年struct from motion比较火。如果是用Kinect之类的RGBD相机,比较好的有微软的KinectFusion,PCL的开源KinFu,以及MIT的加强版Kintinuous。如果用激光,那一般都是当SLAM做了,前端嘛就各种ICP配准算法了,后端的话,三维中主要还是用图优化来做。
收藏·没有帮助·
Kaixiang Wang,希望认识更多控制工程同仁
(不知道为何想到的答案跟楼上完全不一样……)


假如没记错的话,当时做CV大作业的时候有用到structure from motion或者visual hull(第二种方法亲测可行哦,重建了黑客帝国里坐在椅子上的Morpheus模型),不过题目事先给出了轮廓的坐标等等。或许楼上的答案正好是和这些数据的采集和处理相关的吧。


SIFT我记得是object detection吧。
RANSAC貌似是找回归方程吧,可以替代最小二乘法。

纯属抛砖引玉啦。
收藏·没有帮助·
吕无忆,学生
新手心得。三维重建有好几步,每一步都有好几种方法。第一步的特征提取就有SIFT,SURF,FAST等,第二步配准主流的是RANSAC的各种改进型算法,第三步是全局优化,有bundle adjustment的各种改进型还有用图的方法,最后是数据融合,也可用已有的软件完成。方法很多,还是得看自己的问题和数据然后选择合适的。
如果将来有能够很精确测量每时每刻相机的位姿的传感器就好了,前面的都不用做,直接数据融合。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
一文解析基于特征点的视觉全局定位技术
基于SIFT特征的全景图像拼接
基于图像配准的药用玻璃瓶印刷字缺陷检测
一文读懂自动驾驶中基于特征点的视觉全局定位技术
合成全景图中计算机视觉技术的知识和原理
[转自嘀嗒印]打造离线版 123D Catch
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服