是否可以 DIY 一個 3D 掃描儀或者開源 3D 掃描項目?


高一高二的時候用了一年半設計過一套手持3D掃描系統,有數學模型和論文,還有數據處理軟體。2014年丘成桐中學物理獎的銅獎= =

下面貼點自己的設計唄~~ 之前還沒有怎麼宣傳過,不混開源社區,其實做得不算非常完美畢竟是個人項目嘛,摸爬滾打

————————多圖預警——————

V1.0圖片(轉盤式)

V1.0圖片(轉盤式)

V2.0圖片(手持激光線掃描)

V2.0圖片(手持激光線掃描)

————————分割線————————

整個系統的一個總體思路是渲染的逆向工程

之前在論文里寫了關於可變焦3D掃描的研究,包括物理設計與數學實現,已完成的部分的物理和編程實現。其主要流程是,在較暗環境中,用激光線(結構光)進行照射與拍照後要對數據進行處理。主要處理流程包括:

(1)對圖片的採樣計算獲取2D點;

(2)從2D信息中生成3D頂點;

(3)標識點的識別分析並計算出當前照片相機的部分剛體變換信息;

(4)坐標變換;

(5)網格重構 。

運用了光學規律與定律、傳統幾何、線性代數、計算機三維圖形學理論等來設計了一個從現實世界的物體轉化為3D數字模型文件的系統,在理論上已經實現了一個手持、可變焦的3D掃描儀。物理實現上主要的感測器僅為重力感測器。

所以其實設計上,只用了單反,紅色激光筆,重力感測器,還有一個標識結構。

外國在理論和實物上已有比較成熟的發展。其中已發展出了民用的掃描儀,美國3D印表機廠商MakerBot CEO布瑞·佩蒂斯(Bre Pettis)在SXSW互動大會上展示了3D掃描儀的原型品Digitizer.此掃描儀的價格在1800美元左右,但這個是轉盤式的掃描儀,雖然沒有手持掃描儀的方便,而且表面信息容易獲取不全,但是和國內四五位數的價格比起有著較大的優勢。而且相對與轉盤式等掃描儀,手持掃描儀因為其更為一般化的演算法和技術,價格也是異常昂貴。

所以了喔= =想著自己開發玩玩。試一下嘛學學東西。

然後就一發不可收拾了。

我是做過兩個版本的,V1.0是物體放在轉盤式上掃描,這樣會容易產生盲區,因為有些地方是拍不到而且是激光照不到的。停滯了一段時間學線性代數和計算機三維圖形學之後,再繼續開發第二版。

不說廢話了。

一、局部空間(Local Space)

無論是哪個版本,第一個任務就是升維。但是很多人就會覺得奇怪,為什麼從一張二維的圖片可以憑空生成三維的坐標???嗯嗯嗯確實不可以憑空生成三維點,因為信息丟失了就不可能再找回來了。所以要生成一個三維點就需要更多的信息。

第一步,就是要生成局部坐標。我們這裡定義的局部坐標,就是在相機參考系內,或者說,站在觀察者的角度看問題測出來的坐標。一步步來嘛

來講講我設計的掃描結構(感覺市面也有類似的,有點啟發的)。看俯視圖,先要一台單反(其他也可以,我家剛好有單反,還能順便做變焦掃描儀,平衡了掃描尺寸和精度的矛盾),然後放紅色激光,在激光頭的出口處擺一個玻璃柱,讓激光線變為激光面(可以在牆上投出一條豎線),而且激光面平行於主光軸,一開始的時候是垂直於地面

下面是側視圖。

所以我設計就是激光面到主光軸的距離是確定而且是已知的,記為CamToLight,單位mm。

我們還要知道相機的參數如視場角,拍照的像素尺寸

事實上,照在牆上是直直的一條激光線,照在凹凸不平的物體上就不是了,起碼在照片裡面不是。

上圖就是了,一條激光線,照到盒子上,拍照,pia,分成了兩條。為什麼會這樣??怎麼定量分析???

計算機圖形學裡有一個概念叫視截體,這是非廣角Camera的一種理想模型

這說明了相機是進行透視投影成像的。

所以我們可以根據這個繼續下去。

看俯視圖。

AB:主光軸所在直線上的線段,之後延伸為光心到虛擬背景板的距離,命名為「標準深度」(Standard Depth,瞎編)。實驗證明這個量無物理意義,這個「標準深度」,即到虛擬(假想)背景板的距離,是可正可負的,所謂的背景板只是選用一種標準,是想像出來的,無論是否有真實的背景板。實際上採用多遠的背景板,測量點到光心的距離都是不變的,變的只是測量的深度。

DF=BC:紅激光線到主光軸的距離

CD:物體到背景板的距離,命名為深度

GH:視截面的長度,D在此視截面上。

IJ: 視截面的長度,C在此視截面上。

∠JIA:記作∠θ,可視角範圍

然後我們把目光從世界空間轉到屏幕空間。要結合成像才能推出公式。

P預:「基準線」在屏幕上的X坐標,這個基準線與圖片橫邊垂直平分線的距離,與上文提到的「標準深度」有關,原因顯而易見。

P實:實際成像點在屏幕上的X坐標

PictureHeight:照片縱向像素數

PictureWidth:照片橫向像素數

演算法基本思想(由偏移得高度):照片上偏移的比例等於實際偏移的比例

我們把上面公式編程成函數,名字叫GetDepthFromOffset(自己瞎編)。這條公式是第一部分的基礎,作用是根據紅激光在成像上的偏移測出它到 」背景板「的距離,相當於Z坐標。再結合成像的xy坐標,我們就可以算出坐標的xyz分量。(用左手系,y軸指向天,z軸往前插,x軸向右)

但是,xyz的實際三維坐標(局部空間)中還是要計算的。

LocalX:絕對值為CamToLight,符號由激光在主光軸的左右邊決定。攝像機正交基x軸正方向朝著視角的右邊,z軸是視向量。

LocalY:

實際上,Local Y坐標還和LocalZ坐標有關,所以實際計算的時候是先要計算Z坐標的。如圖,

EF :長度為R,某一視截面的實際高度,方便起見我們還假設EF就是背景板

A:物體上的一個可視點

OB :標準深度,焦點到背景板的距離

AC:測得深度,值為z

ED/EF:這是一個比值,值為k,可以根據成像獲得,即 (屏幕上端到A點成像的距離) / (屏幕高度),這個應該要用像素數去計算。

d:標準深度

z:到背景板的距離

LocalZ:值為StandardDepth - GetDepthFromOffset 。

事實上到這裡,我們已經可以生成圖像中像素點的局部三維坐標了。

二、提取激光線,生成二維點

看圖應該也差不多明白了唄=。=設定一個顏色閾值,對每一行像素進行遍歷,尋找顏色轉折點,得到激光線的像素坐標區間。我就簡單地對區間取個平均值,從而提取出每一行像素上激光線的大致X坐標。

三、世界變換

在計算機三維圖形學裡,有渲染流水線這一個說法(貌似叫render pipeline?)。在進行三角形渲染之前都要進行頂點變換(Vertex Transformation),有人叫這個是「頂點變換」三部曲,意思是通過WORLD,VIEW,PROJECTION三個矩陣把處於局部模型空間的頂點轉換到相機的正交投影空間,並且投影到「底片」上。這些東西偶像們 @Milo Yip@叛逆者 不知道是多少年前就在玩的。(我在想這個思路還是挺有趣的)

「渲染」(render)做的事是從三維數據生成圖片。而3D掃描是一個逆向工程(Reverse Engineering),所以我們可以借鑒渲染管線,進行一個逆向變換,轉到世界空間中。這個世界空間是唯一的確定的。

為什麼要確定一個世界坐標系????因為我們拍的圖片分析後生成的頂點只有相對於相機參考系(局部空間)而言的坐標,而且理論上每張圖片相機的位置,姿態角都不一樣,所以才要對每張圖片的所有頂點進行對應的變換,整合到一個坐標系下。

假設我們知道相機的姿態角(用重力感測器測,用Yaw-Pitch-Roll角度系統),和世界坐標,我們就可以用一個仿射矩陣去實現變換。

用的是列向量,下標別太在意,和歐拉角混用一下。用這個剛體變換矩陣就可以實現頂點的整合。

四、標誌點——光學解算,實現手持的重要一步

前面說:

假設我們知道相機的姿態角(用重力感測器測,用Yaw-Pitch-Roll角度系統),和世界坐標,我們就可以用一個仿射矩陣去實現變換。

其實有些量並不是那麼好測。例如光心的世界坐標(就是相機位置),如果用加速度感測器,時間久了容易會有積累誤差。(倒是我以前根本沒想到,用加速度感測器可能可以用PID控制去減少誤差,不過不是很會)。

所以那個時候設計了一個光學校正演算法。基本思路是,充分利用已有的信息(圖片中標誌點的2D像素坐標,相機參數如視場角,重力感測器測出的俯仰角和翻滾角)去除相機翻滾角和俯仰角的影響,預測出沒有俯仰角和翻滾角時標誌點的相對位置,從而得出相機的水平角(航向角)和世界坐標。

需要有的物理結構是一個正方形框框,四個頂點分別放置一個顏色的燈。理想狀態如下:

利用燈光顏色就可以確定哪個點對應哪個點。但是有個缺點就是OABC四個點必須全部都拍到(而且我沒考慮干擾,去噪,因為根本不會= =所以用3DSMAX渲染出理想圖片之後反過來用我的軟體處理)

我們可以定義O為世界坐標系原點,OB為世界X軸,OA為世界Y軸。

此標識結構的作用有幾個:

1,提供成像信息用以計算攝像機等效光心(攝像機位置)的世界坐標;

2,提供信息重力感測器不能測得的水平角(航向角);

一開始我們要去除翻滾角影響。

不過實際上在屏幕空間旋轉一下就校正好了~~= =爽(其實就是繞主光軸Z軸旋轉一下)

接下來,我們利用圖片上標誌點的2D像素坐標在3D空間中引出一條「屏幕射線」(跟渲染引擎里的Picking射線類似)。

然後我們經過一系列巧妙的糾結,可以求出相機位置到兩個標誌點的距離。然後 向量+距離 就可以求出O,B兩個點在這個空間下的局部坐標。繞X軸旋轉一下便可以去除翻滾角影響。

在這個空間下,相機是相當於只有航向角的影響,在這你會知道相機到四個標誌點OABC的相對坐標。所以簡單的變換一下,繞Y軸旋轉一下,對齊一下,就能得到相對坐標和航向角。

然後其實完整實現到這裡就可以得到3D點雲了。(不理會去噪這些問題= =)

(圖像分析不大會,激光線提取的不好,加點其他誤差,搞得有點噪點)

五、網格重構(Mesh Reconstruction)

額,這種三維散亂點雲的重構是一個大課題。有成熟演算法不過也看不懂T T。

我就說說的我的小想法= =適合拓補簡單,就是球那樣的結構,胖乎乎的點雲。

先把頂點投影到單位球上

像世界地圖那樣展開。

到這個帶邊界平面上。

最後進行2D的Delaunay三角剖分,得到三角形數據和鄰接數據,最後映射回三維空間。

六、曲面細分

呵呵我連重構都沒搞好細什麼分

七、計算相機視場角

這個工序在順序上是應該在流程的第一步。單反做取景器真的是大土豪= =。那就順便用上單反鏡頭可以變焦這個功能。

然而在編程上怎麼實現呢= =???因為你又沒有佳能廠商的支持,做不了一個實時更新視角或焦距到電腦的自動化系統。所以用了一個小hack,在jpg文件中提取"EXIF「信息,引用百度百科

Exif是一種圖像文件格式,它的數據存儲與JPEG格式是完全相同的。實際上Exif格式就是在JPEG格式頭部插入了數碼照片的信息,包括拍攝時的光圈、快門、白平衡、ISO、焦距、日期時間等各種和拍攝條件以及相機品牌、型號、色彩編碼、拍攝時錄製的聲音以及GPS全球定位系統數據、縮略圖等。

你看,有焦距!!然後就可以拿焦距來計算視角,之後就可以生成三維點,然後繼續下去

———————分割線——————

V2.0的掃描系統也是爛爛的,反而是V1.0我實現從掃描到列印(不過噪點還是多)。然而,

v2.0還沒有集成自動化系統,別看我,我不會

(; ̄Д ̄)

在開發演算法和軟體的時候都是用3dsmax渲染的理想圖片來餵給我的程序處理。研究的時候在得不到正確的結果時真的是萬分糾結,因為根本不知道是演算法、還是編程、還是實驗數據、還是實驗參數出了問題,可能是這裡漏了個符號,那裡居然沒有用臨時變數,局部Y坐標公式錯了5次,標識點處理仰角的豎直邊居然不平行於屏幕豎直邊,維基的歐拉角矩陣看得一頭霧水,變換不對時又不知道是變換錯了還是標識點識別錯了或者是計算錯了,實驗時設定數據想當然想到一個以為和真實情況等價的結構但是卻並不等價......排錯非常困難,當時也是夠拼的。

編程,我都是用VB實現的呵呵呵呵呵呵呵呵,渲染引擎是支持vb的TrueVision3D。

紀念Vb時代:

高一做的遊戲 還是VB黨 心酸

————————————————————

那次去面對一堆Princeton,standford清華復旦的教授答辯真是免費好好地練了一把英語,雖然最後也有點跪在了英語上。第二天的清華的面試也沒有什麼鳥用,成績太差,教授們面面相覷。所以這個項目在升學上並沒有什麼鳥用,但是卻讓我學到了很多東西,很讓我第一次接觸到「學術」。 真心覺得科研是非常難的,而且很辛苦。所以我覺得我以後能做個工程師已經是非常滿意了。

成績不穩,高考跪慘了。今天錄取簡訊發來了,靠著可憐的自招加分進了華南理工大學,也不錯,起碼不用出省= =

現在在做DirectX11的渲染引擎,不知道夠不夠能力T T。大學好好學吧。


搜索看到這個問題,樓上高中生厲害!

這裡獻醜,我本人大四畢業設計也是做了 3D 掃描儀, 當時受了csk大神[1] 的啟迪,看到樓上也有人發,正好當時在學Opencv就跑去跟導師說我要做這個,死乞白賴借了個4000塊的工業CCD跟一個精密光學旋台就開搞了。當時還沒入計算機視覺這個坑,硬是從相機矩陣一點點開始啃,OpenCV 也是那時候接觸的,還興沖沖跑去學 MFC 妄圖寫個高大上的界面,直到後來碩士期間接觸了QT....OMG。

當時做出來的系統是這樣的:

系統框圖(丑):

跟小同學的方案不同,我對於掃描角度的控制是通過精密電控旋台來實現的,就是上圖裡面3D掃描儀下邊那個黑乎乎的鐵坨子。 要實現步進掃描,首先要實現的一個功能就是,電腦上位機程序能夠通過指令傳輸控制這東西的旋轉角度,簡單說就是電腦給出一個數字,旋台自動轉動這麼多角度。

結果等拿到那個價值6000大洋的精密旋台,發現原版的控制箱只提供手動的轉動角參數輸入,雖然提供了可電腦編程式控制制的RS232介面, 但到處都找不到介面協議說明書,打電話問原廠,廠家表示產品太舊早早就停產,估計設計的工程師有,但人家回家帶孫子了。。。。

於是我還得自己做控制器,好在步進電機驅動也算是自動控制的基礎科目了,懶得自己焊上淘寶買了驅動器,再加一個STM32最小系統板輸出控制信號,用UART串口與筆記本通信,算是解決了這個問題。

控制箱長這樣,老大一個,搞得大家都以為這個是掃描儀的本體:

為了濾掉環境光的干擾,鏡頭前得加窄帶濾光片(固定圈是我拿藥瓶蓋一點點掏的,本科生做點東西真心寒酸, 右圖是使用的線狀激光器:

得到的光斑是這樣的:

最後的掃描結果是這樣的(已經過 remesh 插值,原本的point cloud 文件已經丟失了):

關於原理,那位小同學已經講得很明白了,我們的方案都是屬於基於 triangulation 的 structured light 掃描原理,就是根據線狀光斑在相機平面成像的水平位置利用三角形幾何相似來計算光斑實際位置到相機平面的距離, 這是當時論文的配圖:

推算的公式是:

這個圖只描述了當光斑處在相面水平中線的情況,因為實際是線狀激光,所以其實還要考慮在相面y軸存在水平位移的情況,示意圖如下:

與之對應的公式更複雜,就不放上來占版面了。

於是在相機拍下一張有線光斑的圖像之後,在相機平面 x 方向的某行像素陣列上,圖像灰度的分布會是這樣的:

可以看到中間的那個大峰值就是光斑。 理論上最簡單的提取光斑的位置的方法是找到一行中灰度值最大的那個像素位置,但這樣由於像素位置的離散性,掃描結果的解析度會受到影響。於是乎這裡引入了亞像素光斑位置插值的思路,就是通過對灰度分布進行估計,來找到光斑峰值在單個像素裡邊的具體位置, 示意圖大概是這樣:

插值方法很多,有很多這方面的論文,最流行的方法是把光斑強度分布近似看做一個高斯分布,然後用這些離散的像素點去估計高斯分布的mean value。

最後是定標,雖然上面公式裡面默認相機內參,掃描儀基線幾何尺寸以及激光線與光軸的夾角都是已知的,但實際上這些需要靠實驗來獲取,一方面是為了精確,另一方面是有些量比如基線真實長度難以直接測量。

相機內參,用廣大computer visioner 喜聞樂見的chess board calibration, 同時這一步也是為了得到校正相機鏡頭畸變的參數,matlab 就有實現此功能的toolbox:

然後就是用矯正好的相機對一系列標準距離上的被測平面進行測量,記錄若干組 「實際位置—光斑位置「的採樣數據,然後對這些數據用 least square minimization實現擬合,得到三角測距方程裡面幾個參數的實際值,比如基線長度,夾角之類的:

到此完全講完了,GUI 用MFC寫的

References:

[1] CSK.Blog-自製低成本3D激光掃描測距儀(3D激光雷達),第二部分

[2]K. Konolige, J. Augenbraun, N. Donaldson, C. Fiebig, and P. Shah, 「A low-cost laser distance sensor」, in ICRA, Pasadena, 2008.

[3]R. B. Fisher, D. K. Naidu, 「A Comparison of Algorithms for Subpixel Peak Detection」, in BMVC , 1996.


------------------首發於2015-07-14,更新見底部----------------

樓上有個高中生DIY一個激光掃描儀確實把我嚇到了

如果沒有人指導的話,那種自學能力還是很nb的

不過題主問的是三維掃描儀,還想用在快速建模上,且希望結構簡單點。

激光線掃描的一個大問題是需要有一個可靠的移動平台,否則測量的精度和解析度就相當有限了。

還有一個常用、成熟、且對器材要求不高的方法是條紋投影。

整套系統只需要一個相機,一架投影儀,一台電腦(Rasberry Pi之類的作控制器也沒問題)。

DIY愛好者電腦、相機肯定是有的,家裡或者工作室可能也有投影儀,那就幾乎零成本了。

如果不想單獨買一個投影模塊,可以考慮帶投影功能的平板手機,或者教學用的投影儀也可以——對便攜性沒用要求的話,擺在桌子上用用。不光速度快,亮度也比mobile模塊高。

相位解包絡和三維重建的演算法也比激光線掃描或者三角測量容易不少。

下面是TI買的一個微型投影儀,大概跟Android低端機的價位相仿,已經附帶三維測量的流程了:

3D Machine Vision System Solutions

我用TI的這款DLP也DIY了一個掃描儀:

用了兩架投影儀為的是消除大件物體的陰影(其實我是買了4架備用的。。。)

微型投影儀的投射距離、投影面積、投影解析度其實都遠遠不如做ppt報告的常用投影儀,

所以節約這個零件的錢,其實效果更好。

走線很醜不要計較了,用來trigger相機和投影儀同步。

效果如下圖

5x5mm的小零件, 100x70mm的常規大小的滑鼠

偽彩色就是被測物體的高度。(消噪以及後期處理的部分還沒做好)

標定後的X-Y解析度10微米,Z(高度)解析度50微米左右,目前有號稱達到5微米解析度的——不用操這個心了,DIY自己建模玩玩sub-mm也夠了

------------------更新於2016-07-25----------------

具體描述見專欄:趣談條紋投影三維測量系統(篇外)激光掃描系統 - 光棱坦克 - 知乎專欄

用激光線掃描也是相當可行的,

配合適當的線長和相機鏡頭,原則上適用於從微小零件到大型設備甚至建築物的掃描測量。

根據實際測量需要可選擇步進電機用於平移或者旋轉。

而且系統的複雜度不高,後繼圖像處理難度也很低。

貼張系統圖和效果圖:


樓上的高中同學DIY 項目真的讓我很崇拜啊。

我現在高考剛剛結束 ,我不是業內人士。看到感興趣的我就過來了。

第一次回答問題。

以前嘗試用opencv 做過一個實時對手的點雲重建。

不過現在都有現成的方法。

關於3D重建這一類問題。

現在能做到,商用級別的普遍是使用結構光方法。

MS的Kinect ,Intel的 Realsense 就是採用的這種方法

他的工作原理就是讓紅外激光DOE光柵 後高比分束為成千上萬的小光束,即通常我們所說的散斑,射在物體上。攝像頭通過捕捉反射的紅外散斑,交由處理器進行解碼後可計算出物體的三維數據。

來看看Kinect 的組成

--圖片侵權私信我!

這是紅外攝像頭拍攝到的 紅外散斑圖像

這是實物到點雲的重建流程

Intructables上 也有很多DIY 3D掃描器的

這是用kinect做的 3d掃描器

EASY Kinect 3D Scanner!

還有用線性激光器做的3D掃描器

Make your own 3d scanner!

當然還可以直接用兩張左右圖直接 匹配出 3D深度圖。

對攝像頭進行calibration後得出畸變參數,就能用Opencv進行視覺匹配。

LEFT

Right

調用opencv的BM方法得到的深度圖

還有另外一種簡便快捷的方法。

前段時間 AutoDesk公司推出了普通用戶的建模軟體Autodesk 123D

只需要按照序列拍攝不同角度的物體就可以輸出3D模型。

http://jingyan.baidu.com/article/a501d80cf77cc3ec630f5eed.html


ZZ 自製低成本3D激光掃描測距儀(3D激光雷達),第一部分

那位高中大仙,就收下我的膝蓋。。。@雞哥

下面說下怎麼提高精度:

1 物理模型改一下,改成直接求激光平面(或者激光射線)和相機光束的交點,雖然其實是同一回事,但這樣好利用通用的一些演算法。坐標係為光心坐標比較方便,激光平面要通過標定得到,標定方法同下面的opencv,都通過已知平面得到。

可以不用歐拉角,直接用旋轉矩陣,歐拉角轉來轉去很麻煩, 而且每次計算都帶上 Pi , Pi位數取的不夠多還有誤差。

2 鏡頭選個定焦的,焦距選長些,光圈中間檔,這樣畸變像差都小些。

鏡頭裝好後要標定, 俄國人(好像有莫斯科大學)有個改進版的opencv標定軟體,很好用。

3 激光如果可以調焦, 調到最細,最高亮度不要超過255,灰度重心法求中心。


1.前幾年有很多MVS(multi view stereo)的文章,就是你用相機繞著一個物體拍很多圖像,以這些圖像作為輸入算出面片(或者密集點雲)

比如

[1] A Comparison and Evaluation of Multi-View Stereo Reconstruction Algorithms,2006

[2] CMVS-PMVS pmoulon/CMVS-PMVS · GitHub

2.最近幾年有很多基於kinect的建模,從理論上來說,應該是前面MVS的實時版本(個人見解,假設你拍攝幾千萬上萬張圖像,然後做成一個視頻流,應該就很像kinect了),

[3] Efficient model-based 3D tracking of hand articulations using Kinect, 2011.

但是,上面說的兩種方法我都沒有看到非常好的結果(與三維掃描儀相比)

三維掃描儀大概長下面這樣,它的原理應該和kinect類似,但是精度非常高,掃描的時候物體上面會看到一個紅點,紅點動的比較快,殘影看上去是豎條的,掃一幅深度圖需要幾秒到幾十秒。

和 @雞哥給的設備看上去差不多,我們用的時候也是把物體放在檯子上,掃一個面就旋轉一點。

(這種三維掃描儀很貴,所以後來才出現了MVS這類的方法)


昨天碼了幾百字就是發不出去,就寫簡單些吧。最便宜的,就是多拍幾張,然後有軟體做multi view reconstruction的。最快的當然是kinect之類的,三十fps,但是精度和抗干擾太差還有距離限制,畢竟那是體感用來掃描人那麼大的東西。再慢點效果更靠譜的,就是結構光光柵投影的了,使用格雷碼編碼的圖投射到物體上,行編碼列編碼解算出來就知道相機和投影儀的點的對應關係,然後就是兩個空間直線相交得到一點。這種投影還有用相位光柵的,需要投影的圖最少只需要三張,可以實現實時!精度最好的是片光法也叫光切法了,就是用線激光,叫sheet of light,可以到um級的精度,甚至nm級。還有就是用激光點的,大型的建築,自然場景掃描的像atos之類的掃描儀,也是投射激光光斑,激光和相機在同一坐標系中的相對位置是預先標定好的,然後又是兩條空間直線香交得到空間一點,然後底座旋轉。還有一堆one shot的方法,可以在youtube上搜搜看。還有使用電動鏡頭的,這種鏡頭的景深很淺,這個叫做deep from focus。還有就是光度立體法,從不同方向的光源來照同一個物體,很神奇。。。具體演算法實現google一大堆。


多圖預告 這是我的作品,基於xilinx公司zynq晶元

的3d掃描和列印。物體處於一個步進電機控制的旋轉平台上,採用線激光掃到物體表面,然後用加了濾光片的攝像頭採集圖像。當物體旋轉一周後,得到物體的3d點雲圖,並生成表面信息,然後生成列印用的stl文件。對圖像處理步驟如下

1. 對每一幀圖像二值化,對線激光的區域細化,根據細線位置,來計算物體的距離,存到一個數組裡。旋轉一周後,生成一個深度圖。

2. 對深度圖濾波,然後根據旋轉的角度,將深度圖的坐標進行轉換,生成點雲,用到了簡單的三角函數

3.最後,將點雲進行表面處理,因為stl文件需要表面的信息。就是將上下左右相鄰的每三個點連成一個面,生成包含很多小面的一個集合。

4.將生成的stl文件存儲到sd卡,發送到電腦就可以看物體的三維圖,並進行列印了。

首先是實物圖

下圖是待掃描的物體,放置於步進電機旋轉平台

下圖是掃描後的結果,用meshlab軟體查看

這是最後列印的白色模型,以及原物對照。

下圖是系統核心架構的說明


我調查過,這個有開源的(軟體加強硬體的成套開源),安道理一個激光器,加一個攝像頭,可以基本做出掃描效果,但是要調整框架一類。其實xbox的體感也是可以做3D掃描的,你可以谷歌一下。回頭我補一下我調查資料的鏈接給你。


《無線電》雜誌有幾期介紹過一個利用激光led+攝像頭做的掃描器,用的是opencv技術,程序好像也開源了,有興趣可以google一下相關期刊


這是自問自答么


kinect,不貴吧。。。


不知樓主是否可以將代碼分享一下 我的QQ:1298313458 具體情況咱們可以私聊


高中就可以這麼牛逼,可以。。。


我初中剛畢業,矩陣什麼的都還看不懂啊!咋辦?


stm32單片機加步進電機加線陣ccd,成本100塊不到。


三維掃描數據處理可以關注Geometry++:關於Geometry++


三維掃描儀可以租用。用的不多的話沒必要買,想自己開發一個的話,原理也許不難,但效果呢?老實的說幾萬和幾十萬的機器差距還是很大的,還是有技術含量的。偶爾需要用用還不如看看當地有沒有租用服務。沒有的話可以快遞到外地去掃描。

工業級別的比較貴,樓主既然是做遊戲,精度可能不用很高。便宜的機器估計也能勝任。


百度一下Ciclop就有了。

知道這個是因為在某3D列印群里,有人發了安裝視頻。


你可以試試 123d catch

當然有錢的話還是 kinect


推薦閱讀:

學化學,沒有專業計算機知識,想考計算機第二學位(大方向),如何快速發現自己喜歡的方向?如何自學?
已選擇留學紐西蘭讀一年信息技術的gd課程,但沒有任何計算機基礎,很擔心不能學好怎麼辦?
postgresql也很強大,為何在中國大陸,mysql成為主流,postgresql屈居二線呢?
OCC和MVCC的區別是什麼?
無任何IT相關經驗,30歲轉行學DBA或者系統管理員可否??

TAG:圖像處理 | 信息技術IT | 計算機視覺 | 計算機圖形學 | 3D列印 |