三維重建 3D reconstruction 有哪些實用演算法?


簡歷發這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


三維重構演算法得看你用什麼感測器了,如果是雙目相機,那一般都是極線幾何加視覺特徵配準的演算法了,優化就用bundle adjustment。如果是單目,較早的有PTAM,DTAM,近幾年struct from motion比較火。如果是用Kinect之類的RGBD相機,比較好的有微軟的KinectFusion,PCL的開源KinFu,以及MIT的加強版Kintinuous。如果用激光,那一般都是當SLAM做了,前端嘛就各種ICP配准演算法了,後端的話,三維中主要還是用圖優化來做。


首先一切建立在相機模型 x=kPX 上
(x,X分別代表圖片和空間中的二維三維齊次坐標,k為相機內參矩陣,P=[R | t] 為空間坐標繫到相機坐標系的 orientation- R 和 translation- t)

1, 首先對某一場景多角度多位置得到很多初始數據,選擇其中的某兩個來初始化,選定其中一個為空間原點。

2. 通過SIFT SURF等特徵點查找匹配之後,用 8點法 和 RANSAC,多次計算兩張圖之間的Fundamental Matrix,選擇其中最好的一個

3.用F-matrix計算Essential-matrix

4, 用E-matrix計算相機的R和T,需要用SVD分解,因為orientation R是一個正交陣。

5, 得到兩個相機之間的P矩陣之後,通過對應點,用Triangulation計算對應點的空間坐標。

6. 第三個位置的照片,直接根據已有的上步計算的點,與第三個位置圖片上點的對應關係,計算P矩陣。

7. 最後全局優化,Bundle Adjustment

8, Bundle Adjustment所有的藝術就是優化 hessian matrix的逆矩陣

------------------------------------------------------------------------------------------------------------
推薦賓大Shi Jianbo教授在Coursera上的公開課 Robotics:Perception
上面所有的截圖都來自他最後一次課的視頻講義截圖
https://www.coursera.org/learn/robotics-perception/home/welcome
配合視覺聖經 Multiple View Geometry來看簡直完美。Ransac, Bundle-adjustment, 2-View, Homography全部都有。一共四周,有線性代數基礎(主要是SVD用來解線性方程),作業用Matlab.

第一周作業: Dolly Zoom
第二周作業: 平面攝影幾何,廣告牌在視頻中的投影,類似2D增強現實
第三周作業: 在平面Barcode上通過sift檢測特徵點,通過H矩陣計算相機位置,做3D增強現實
第四周作業: 3D重建


基於rgb單目的可以參考bundler+pmvs(離線),主要的pipeline就是基於multiview geometry(sfm)求每張圖的pose和稀疏的三維點,再利用得到的pose去做dense stereo來得到稠密的點雲,比較好的效果可以參考VisualSFM。

在線的單目重建比較經典的是DTAM,和前段時間微軟做的monofusion,原理類似。缺點是沒法做稍大場景的重建以及重建精度不高。

以上兩種基於單目的重建都是可以得到不知scale的幾何結構。

雙目的話我就歸到rgbd相機的重建里了,底層得到深度圖的原理可能是結構光,雙目,激光,或者tof。主要用icp來做slam可以做稍大場景的三維重建而且計算量不高,精度較高可以達到1cm以內(雙目可能低些),一般儲存方式就是點雲的fusion以及用voxel表示,主要是受內存或者gpu顯存限制重建的大小,以及slam的精度限制大場景重建的精度。具體參考kinectfusion,最近基於voxel hashing的方法可以大大增加重建大小但是跟蹤精度就是slam的問題了,個人認為暫時無解。

個人感覺最近三維重建的方向都是在semantic以及動態場景的重建,可以看看帝國理工andrew davison的和他學生的一些文章,算是現在state of art的了。瓶頸和難點還是在drift-free的slam上不過這個又是另一個話題了。


目前來說「實用」的主要有兩類:結構光方法和sfm方法。
結構光方法適合室內高精度重建,目前商業產品已經比較多,相對成熟;
sfm方法比結構光更方便,無需事先標定相機,但精度差些,目前很多用無人機對大型建築建模就是用的sfm方法。
其它重建方法還有很多,建議找幾篇綜述看看


打個擦邊球,最近我lead的國家級大學生創(hua)新(shui)創(xian)業(yu)項目快結題了,做的是基於醫學CT切層掃描的肝部三維重建。最後還要可視化,就是把肝部的三維模型渲染出來,這樣子的畫我們團隊選擇的解決方案就是重建出三角形網格再基於我的迷你3d引擎用傳統方法渲染。

.

1,CT斷層掃描

CT(電子計算機斷層掃描)_百度百科

CT(Computed Tomography),即電子計算機斷層掃描,它是利用精確準直的X線束、γ射線、超聲波等,與靈敏度極高的探測器一同圍繞人體的某一部位作一個接一個的斷面掃描,具有掃描時間快,圖像清晰等特點,可用於多種疾病的檢查;根據所採用的射線不同可分為:X射線CT(X-CT)、超聲CT(UCT)以及γ射線CT(γ-CT)等。

.

反正要做一次CT掃描,就整個人躺在那,從那個洞里經過,全身過一遍。然後就能得到全身幾十或者幾百張CT掃描斷層。(想像把一個人切成幾百片吧,但是CT掃描只是像一系列採樣而已,而且數據是灰度圖)

一般的CT圖就長上面的樣子,上面的圖大概就是在腰或者胸附近切的幾刀(= =我也不知是哪,專業人士輕噴)雖然真的CT圖會有更多信息,但其實就把它當灰度圖看就好了,CT值和器官密度什麼的在這個項目就不管了。

.

.

2,肝部識別

這個不是本回答的重點,只說兩句。師兄說要像上圖那樣標出目標器官大致區域和前後景區域,然後用openCV里的grabCut來把目標區域挖出來,這樣精度會相對高一點。把目標區域挖出來以後就對圖像二值化再保存成文件,屬於肝的像素是1,背景是0

!!!!!!!!然後這個才是重點!!!!!!!!!!

.

.

3,基於MarchingCube演算法的三維重建

這個方法最早在1987年就在論文《Marching Cubes : A High Resolution 3D Surface Construction Algorithm》中被Willian E. Lorensen 和Harvey E. Cline共同提出[1],論文里還特別地提到了一下醫學影像的3d表面重建的基本流程。(ps:這論文到現在已經1.2萬引用了,害怕)因為我看論文並沒有非常仔細,所以有些細節可能跟這篇經典論文有出入,但是大致還是沒問題的,畢竟MarchingCubes演算法我覺得是一個演算法框架,可以有非常多的變體演算法來適應自己的項目

首先,Marching Cube有個迷之中文翻譯,叫「移動立方體演算法」。所以從名字就能大概能看出了,這個三維重建的演算法是一個分治的演算法(divide and conquer)。(雖然「移動」這個詞是有點迷)。

我們先想像一下,用一個超大的長方體包住目標物體(就是目標器官必須完全地位於大長方體內部)。再把這個大長方體,分成 A x B x C個一模一樣的小長方體。

其中,每個平行於水平面的長方體截面就對應著一個CT斷層圖片(的一部分)

上圖是我靈性p的一張示意圖,示意著某個小長方體與和它相鄰兩個CT截面之間的關係。

所以,這個「分而治之」的基本單元就是一個小立方體,這麼做其實相當於是三維空間上的重採樣,所以你要分成多少個長方體其實你可以自己定的。下一個思想也是比較關鍵的,就是判斷小立方體的8個頂點分別是否在目標器官的內部。如果某個頂點在物體內部,那麼給這個頂點標上一個0;如果這頂點在物體外部,則給它標上一個1。好了那麼怎麼判斷某個頂點在不在目標器官內部呢?這就用上了上一個步驟得到的二值化圖,直接看圖的對應位置是不是1就好了(剛才不是說了圖像處理步驟得到的結果,目標器官的區域的像素就標為1)。

.

之後我們根據圖片判斷出8個頂點的「0」與「1」。排列組合就有2^8=256種情況。每一種情況,我們可以在小立方體內生成一些等值面,或者理解成生成0個或多個位於立方體內部的三角形。對,一共有256種局部三角形的組成的情況。

為了針對某個小立方體去生成局部三角形,MarchingCubes非常喪心病狂地做了一件事:窮舉了256種情況能生成的三角形。(雖然,這256種情況可以被概括成15個基本情況,基本情況經過旋轉、鏡像等操作可以生成所有的256種情況)。

上圖就是引用自1987年論文[1]裡面的圖,圖裡描述了15種基本情況。上圖基本說說明了,什麼情況就可以在哪生成三角形。其中三角形的每個頂點都是在小立方體的棱上的。於是每個小立方體都這麼干,所有小立方體生成的三角形拼在一起就是目標器官的表面了

(ps : 這種窮舉法的描述裡面是會有二義性(Ambiguity)的情況存在,在這裡不展開講)

.

論文這麼說是很舒服的,代碼寫起來一點都不舒服好吧。於是就稍微參考了下VTK (Visualization Toolkit)的MC模塊的源碼,可以上github找去,這庫還是很強的。然而看別人代碼,而且是沒什麼注釋的代碼真的難受,所以還是自己寫了。只不過VTK這個模塊的代碼有段很值錢的代碼,對,就是那個窮舉256種情況的數組。

上圖我把VTK里那個珍貴的數組複製了過來=。=不知道有沒有侵權,噓

仔細把那個數組和上面論文里的圖的v1-v8, e1-e12 對比了一下,發現是沒問題的,VTK就是按論文的定義去實現的,注意下標的起始數字就行了。

.

.

4, MarchingCube三維重建效果圖

我的天,丑的嚇人!但是這個丑講道理是不能甩鍋給MarchingCube的,要怪就怪圖像識別做的不怎麼樣:)。(但在MarchingCube演算法生成的模型還是比較多的明顯鋸齒)。

所以最後折衷一下做個網格簡化吧!

好多了好多了!

update1:有個小想法,如果曲面重建的source data是散亂點雲,那可以把三維點正投影到最近的水平切片上,然後用2D Delaunay三角剖分在切片上重建出一個三角形組成的二維填充區域,然後接下來進行上述步驟,感覺也能重建出曲面=。=
.

我寫的MarchingCube演算法代碼放在了github上:

https://github.com/CHINA-JIGE/MarchingCube

--------------------------------------------------------------------------------

引用:

[1]Lorensen W E, Cline H E. Marching cubes: A high resolution 3D surface construction algorithm[J]. Acm Siggraph Computer Graphics, 1987, 21(4):163--169.


http://m.weibo.cn/1402400261/4090748909023134

==========剛剛接觸視覺這方面,非正規軍,說一下我了解的單目視覺三位重建的思路方法吧(僅列舉某些…)
1. Optical Flow/Normal Flow
ightarrow Motion Estimation
ightarrow Depth

  • 從Normal Flow估計運動參數:D Yuan[2] 有數篇文章發在SCI上(這裡給出最新的一篇)
  • 從光流估計運動參數:方法不少,比如[4]

2. SLAM:

  • monoSLAM[1]: 比較經典的個方法
  • LSD_SLAM[2]: http://vision.in.tum.de/research/lsdslam很牛的一個方法,但是對於前向運動的三維重建並不能起作用,視頻https://youtu.be/GnuQzP3gty4

3. SfM:

  • SfM我了解的不多,但感覺和SLAM非常相近
  • MLM-SFM[5]: 做車輛自動駕駛相關的,前向運動、車輛探測、距離估計,還是實時的…
  • LIBVISO(Andreas Geiger): 視頻http://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.


主要的深度學習系列演算法有DBN, ConvNets, RNN等,基本上經典的深度學習演算法都用過。

詳細請看唐路路(研究方向 深度學習 3D重建)在專欄 機器學習深度學習--學術水準的理解 總結的文章 深度學習在3D重建上的應用

近年來Deep Learning在計算機視覺上的應用主要在2D image 的detection,segmentation,classification等方面,感覺已經快無孔不入了。但是DL在3D scene上的研究相對還較少,比如3D reconstruction or 3D modeling。因此,今天我想淺談下image-based 3D reconstruction.

具體來講,image-based的3D重構演算法可以描述為當給定某個物體或場景的一組照片時, 在一些假設條件下,比如物體材料、觀測視角和光照環境等,通過估計一個最相似的3D shape來解釋這組照片。 一個完整的3D重構流程通常包含以下幾個步驟:

1)收集場景圖片(Collect images);

2)計算每張圖的相機參數(Camera parameters for each image);

3)通過圖組來重構場景的 3D shape(幾何模型)以及其對應的相機參數;

(Reconstruct the 3D geometry of the scene and corresponding camera parameters.)

4)有選擇的重構場景的材料等(Optionally texture the reconstructed scene.)。

圖1. 常見的3D重構表達方式

(Image source:Multi-View Stereo: A Tutorial, by Yasutaka Furukawa from Washington
University)

其中最核心的工作是第三步:3D shape的重構演算法。常規的3D shape representation有以下四種:深度圖(depth)、點雲(point cloud)、體素(voxel)、網格(mesh).

近年來,基於Deep learning 的3D reconstruction 也逐漸火熱起來, 例如David EigenNIPS2014上的文章 「Depth Map Prediction from a Single Image using a Multi-Scale Deep Network」,以及Fayao Liu 在CVPR2015上的文章「Deep Convolutional Neural Fields for Depth Estimation from a Single Image」。兩篇文章都是利用CNN網路結構學習預測 a single image與其對應的depth map 之間的關係。然而我個人覺得depth image 還不足以解釋重構原始input的信息,它只能作為3D scene understanding的一個輔助信息。 因此,一些學者開始研究利用一組二維圖來重構3D 點雲圖或voxel以及mesh圖,這裡就不詳細展開了。

個人覺得基於deep learning 的3D 點雲和mesh重構是較難以實施的,因為DL學習一個物體完整的架構需要大量數據支撐。然而傳統3D模型是由 vertices 和 triangulation mesh 組成的,因此不一樣的data size造成了training的困難。所以後續大家都用 voxelization(Voxel)的方法把所有CAD model轉成binary voxel 模式(有值為1,空缺為0)這樣保證了每個模型都是相同的大小。

早期的voxel-based 三維物體重建代表作有3DShapeNet (http://princeton.edu),它採用Deep Belief Network (DBN)來學習 voxel 的 probabilistic embedding 然後在給帶有2.5D信息的圖片後,通過 Gibbs Sampling來不斷預測他的 shape class 和填補他的未知voxel以完成3D模型重建。

後續又有CMU的paper 「Learning a Predictable and Generative Vector Representation for Objects」,利用auto-encoder 學習3D Model 的 embedding, 然後通過 ConvNets學習一個 deterministic function 讓其 rendered image infer 到學習到的 embedding 上。因為 auto -encoder是generative的,對於新的test image,模型就會infer 到相關的3D model embedding,再通過decoder生成其相應的 3D model。

同類型的工作還有Choy 在ECCV2016的一篇文章「3D-R2N2: A Unified Approach for Single and Multi-view 3D Object Reconstruction」。採用深度學習從2D圖像到其對應的3D voxel模型的映射: 首先利用一個標準的CNN結構對原始input image 進行編碼; 再利用一個標準 Deconvolution network 對其解碼。 中間用Long Short-Term Memory(LSTM是RNN中的一種)進行過渡連接, LSTM 單元排列成3D網格結構, 每個單元接收一個feature vector from Encoder and Hidden states of neighbors by convolution,並將他們輸送到Decoder中. 這樣每個LSTM單元重構output voxel的一部分。 總之,通過這樣的Encoder-3DLSTM-Decoder 的網路結構就建立了2D images -to -3D voxel model 的映射.

圖2. 3D-R2N2 網路模型架構

但是,由於3D voxel是三維的,它的resolution成指數增長,所以它的計算相對複雜,目前的工作主要採用32*32*3以下的解析度以防止過多的佔用內存。 但這使得最終重構的3D model解析度並不高, 也可能catch不到一些常規的結構(比如對稱性、直線、曲線等),離真實物體還有較大差距。在DL如此火熱的今天,如何將其更好的應用到3D reconstruction(3D重構) 或3D modeling(3D建模)上確實值得我們進一步深入研究。例如考慮如何提高voxel model 的解析度; 如何選擇best view 和最少的 view來重構3D物體;如何利用mesh 或point cloud來直接重構3D物體等。但由於mesh 和point cloud是不規則的幾何數據形式,因此直接使用CNN是不可行的。但是可以考慮將3D mesh data 轉化為graphs形式,再對3D曲面上的2D參數進行卷積。具體方法有Spatial construction (Geodesic CNN)和Spectral construction (Spectral CNN)。基於point cloud的方法,可以參考大神Hao Su的CVPR2017文章「PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation」和「A Point Set Generation Network for 3D Object Reconstruction from a Single Image」。 但是基於mesh和point cloud的方法總的來講數學東西多,而且細節恢復上效果欠佳。不過可以考慮結合voxel來提高重構精度。這裡就不啰嗦了,有興趣的留言交流。若有理解錯誤的也歡迎指正,謝謝!


新手心得。三維重建有好幾步,每一步都有好幾種方法。第一步的特徵提取就有SIFT,SURF,FAST等,第二步配准主流的是RANSAC的各種改進型演算法,第三步是全局優化,有bundle adjustment的各種改進型還有用圖的方法,最後是數據融合,也可用已有的軟體完成。方法很多,還是得看自己的問題和數據然後選擇合適的。
如果將來有能夠很精確測量每時每刻相機的位姿的感測器就好了,前面的都不用做,直接數據融合。


(不知道為何想到的答案跟樓上完全不一樣……)


假如沒記錯的話,當時做CV大作業的時候有用到structure from motion或者visual hull(第二種方法親測可行哦,重建了黑客帝國里坐在椅子上的Morpheus模型),不過題目事先給出了輪廓的坐標等等。或許樓上的答案正好是和這些數據的採集和處理相關的吧。


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

純屬拋磚引玉啦。


可以先了解一下目前一些開源的項目~
bundler + pmvs+ cmvs+ meshlab可以實現
還有mve openmvg。。。
下面這個視頻有介紹
https://www.youtube.com/watch?v=ELHOjC_V-FE


KinectFusion的開源實現KinFu,基於深度圖像與CUDA的實時重建。


SfM: VisualSFM, OpenMVG, COLMAP, MVE

MVS: PMVS+CMVS, CMPMVS, OpenMVS, COLMAP

Pix4Dmapper, smarter3D...balbla


三維重建精度高的有激光三維掃描儀,結構光三維掃描儀,以前做過結構光掃描儀,採用雙目+投影儀,這個一個角度的數據,需要8路數據採集一個完整的三維物體,進而,完成三維重建。精度很高,適用環境受限。


推薦學習一下 bundle adjustment演算法~


立體視覺方法(雙目、多目立體),Structure from Motion,光度方法(Shape from Shading、Photometric Stereo、 Multispectral Photometric Stereo),深度學習預測,結構光,還有一些基於硬體感測器的比如深度相機、TOF等。


推薦閱讀:

華中科技大學圖像所怎麼樣?
哪些人工智慧領域已經或者未來1-2年會實現盈利?
可以不用openCV,用C++寫一個簡單的人臉識別程序么?
你的導師coding能力如何?
工業相機自動對焦如何實現?機器視覺的自動對焦開發與應用前景如何?

TAG:機器人 | 人工智慧 | 模式識別 | 計算機視覺 | 機器視覺 |