PCL三维重建笔记
三維重建的三種方法:
KinectFusion,直接獲取人體的三維點(diǎn)云數(shù)據(jù),但獲得的點(diǎn)云分散而模糊
Opencv、OpenNI,操作過程過于繁瑣、配置環(huán)境過于復(fù)雜
利用Processing軟件編程,通過導(dǎo)入SimpleOpenNI庫,連接Kinect就可以直接獲得三維模型
相機(jī)標(biāo)定:
相機(jī)標(biāo)定得到的內(nèi)參僅僅是對(duì)相機(jī)物理特性的“近似”
傳統(tǒng)相機(jī)標(biāo)定假設(shè)相機(jī)是小孔成像模型,一般使用兩種畸變來模擬鏡片的物理畸變。但實(shí)際相機(jī)的物理特性很可能沒辦法通過上述假設(shè)來得到完全的擬合。所以需要意識(shí)到,每一次相機(jī)標(biāo)定僅僅只是對(duì)物理相機(jī)模型的一次近似,再具體一點(diǎn)來說,每一次標(biāo)定僅僅是對(duì)相機(jī)物理模型在采樣空間范圍內(nèi)的一次近似。
文獻(xiàn)查詢:
https://www.zhihu.com/people/gai-yong-hu-wei-zhu-ce-72/activities
1. KinectFusion:
目的在于利用一臺(tái)圍繞物體移動(dòng)的Kinect實(shí)時(shí)地三維重建。相比于簡(jiǎn)單的三維點(diǎn)云拼接,該項(xiàng)目支持GPU加速,快速便捷。另外,如果持續(xù)的對(duì)物體進(jìn)行掃描,可以不斷的提高重建
的精度,導(dǎo)出更為準(zhǔn)確的三維數(shù)據(jù)格式文件。Kinect Fusion可以用于工業(yè)設(shè)計(jì)、3D打印機(jī)、室內(nèi)設(shè)計(jì)、游戲制作、城市規(guī)劃等領(lǐng)域。但是該項(xiàng)目對(duì)設(shè)備的硬件要求較高,基于GPU重建的系統(tǒng)要求支持DirectX 11的顯卡,否則Kinect Fusion就運(yùn)行不起來。
PCL模塊:
可視化(visualization)、配準(zhǔn)(registration)、關(guān)鍵點(diǎn)(keypoints)、檢索(search)、輸入/出(io)、濾波(filters)、分割(segmentation)、特征描述與提取(feature)、曲面重建(surface)、八叉樹(octree)、采樣一致性(sample_consensus)、K-d樹(k-d tree)、深度圖(range_image)、通用模塊(common)
基于Kinect的物體三維重建:
Kinect的標(biāo)定(棋盤標(biāo)定);3D.X、3D.Y坐標(biāo)的計(jì)算(真實(shí)世界坐標(biāo));R、G、B坐標(biāo)的提取;點(diǎn)云數(shù)據(jù)配準(zhǔn)(基于最小二乘法的最優(yōu)匹配算法—ICP算法);降噪與濾波(均值濾波)
當(dāng)相機(jī)位姿為0時(shí):
當(dāng)給出5張圖的相機(jī)位姿時(shí):
點(diǎn)云融合流程:
2. Kinect點(diǎn)云融合:
二代Kinect相對(duì)一代各方面都有了顯著增強(qiáng),Kinect1通過投射紅外散斑獲取場(chǎng)景的深度信息,Kinect2改進(jìn)了獲取深度的技術(shù),增加了紅外感應(yīng)功能,除了深度圖像和彩色圖像,我們還可以直接采集其紅外圖像,這對(duì)于Kinect1是非常困難的。Kinect2提供了更高的圖像分辨率(彩色相機(jī)達(dá)到1920*1080),視覺效果更好,同時(shí)SDK中自帶識(shí)別手勢(shì)、骨骼等特征信息的功能,sample給的小程序也很有趣,有興趣可以體驗(yàn)一下。多Kinect定點(diǎn)點(diǎn)云融合
關(guān)于配置環(huán)境,Kinect1運(yùn)行系統(tǒng)要求至高為windows7,其他要求對(duì)于目前的電腦基本沒有壓力,安裝1系列的SDK即可(最高版本1.8);而Kinect2要求較高,運(yùn)行系統(tǒng)需為windows8或windows10,USB接口必須是3.0,CPU主頻和顯卡不能太差,不然特別卡,目前其SDK只有2.0這個(gè)版本。由于Kinect2的特殊要求,暫時(shí)不支持單臺(tái)電腦同時(shí)連接多個(gè)Kinect,而Kinect1是可以的。
關(guān)于我要做的這個(gè)實(shí)驗(yàn),思路是非常簡(jiǎn)單清晰的,主要是點(diǎn)云的拼接配準(zhǔn)工作。計(jì)劃用三個(gè)定點(diǎn)的Kinect完成三個(gè)視角下的點(diǎn)云采集,最后完成點(diǎn)云拼接優(yōu)化。固定好Kinect后,首先要做的是位置的標(biāo)定,我用雙目標(biāo)定的方法用Matlab標(biāo)定工具箱得到不同Kinect坐標(biāo)系間的旋轉(zhuǎn)平移矩陣,進(jìn)而配準(zhǔn)點(diǎn)云。在這里我折騰了較長(zhǎng)時(shí)間,因?yàn)槠鸪跷矣貌噬鄼C(jī)采集的圖像進(jìn)行標(biāo)定,結(jié)果第一個(gè)Kinect下采集的點(diǎn)云通過計(jì)算的變換矩陣轉(zhuǎn)到第二個(gè)Kinect坐標(biāo)系根本難以與該視角的點(diǎn)云對(duì)齊,后來才發(fā)現(xiàn)Kinect的彩色相機(jī)和深度相機(jī)采集的圖像差別很大,所以轉(zhuǎn)而尋求對(duì)深度圖進(jìn)行標(biāo)定。一種方法是改進(jìn)原來的標(biāo)定板,因?yàn)樯疃葓D中黑白格幾乎沒差,檢測(cè)不到角點(diǎn),需要制作凹凸?fàn)畹钠灞P格,這無疑很麻煩。后來通過查找資料才發(fā)現(xiàn),對(duì)于Kinect2,有一個(gè)很方便的功能是可以直接采集紅外圖像,而紅外圖像和深度圖像是對(duì)齊的,隨后的標(biāo)定工作非常順利。用紅外圖像計(jì)算的轉(zhuǎn)換矩陣非常精確的將點(diǎn)云融合到了一起。由于拍攝的是人體模型,這方面就不放圖了。關(guān)于點(diǎn)云的轉(zhuǎn)換,我是通過一段簡(jiǎn)單的PCL程序完成的,有些軟件貌似也可以做這項(xiàng)工作。點(diǎn)云融合的程序可在這里下載。
在不同視角點(diǎn)云采集方面,我用的是SDK自帶的一個(gè)Kinect Fusion做的sample,將該視角的點(diǎn)云保存為ply格式,后又通過格式轉(zhuǎn)換轉(zhuǎn)為pcd格式,作為PCL程序的輸入,輸出同樣是pcd格式,可根據(jù)需要再轉(zhuǎn)為其他格式的點(diǎn)云。做完點(diǎn)云融合后,視需求再做后續(xù)渲染工作,比如通過泊松重建算法優(yōu)化重建模型。
3. 三維點(diǎn)云的拼接:
在三維重建的過程中每次只能測(cè)量有限的區(qū)域,那么拼接的操作就再所難免了,最終拼接的效果往往覺得了你做的產(chǎn)品是否真的有價(jià)值。很多市面上的產(chǎn)品在比較的時(shí)候首先看的是整體的重建效果,而整體的效果就是拼接決定的。拼接的效果由精度和效率決定的,首先是精度主要看最終拼接的點(diǎn)云之間融合的好壞,其次的效率,效率主要考察的是在拼接的過程是否流暢,是否需要很多標(biāo)記點(diǎn),好的拼接效率就是在使用少量的標(biāo)記點(diǎn)也能拼接出高精度的效果。
點(diǎn)云配準(zhǔn)是指掃描采用裝置獲得的兩組有重復(fù)區(qū)域的點(diǎn)云數(shù)據(jù)通過確定一個(gè)合適的坐標(biāo)變換使兩組數(shù)據(jù)點(diǎn)云在一個(gè)統(tǒng)一的坐標(biāo)系下對(duì)齊以及合并。
各類pcd點(diǎn)云數(shù)據(jù)模型:
https://github.com/PointCloudLibrary/data/tree/master/tutorials
Kinect實(shí)時(shí)采集場(chǎng)景(未加入RBG圖像):
場(chǎng)景1:
場(chǎng)景2:
其他學(xué)習(xí)博客:
博客:RGB-D實(shí)時(shí)重建那點(diǎn)事
http://blog.csdn.net/fuxingyin/article/details/58624264
博客:RGB-D Camera匯總
http://blog.csdn.net/MyArrow/article/details/52678020
博客:三維重建基礎(chǔ)
http://www.itboth.com/d/zUfEJrzMvQFf
Kinect的三維重建
http://www.itboth.com/d/vM7VJbyyEzea
tp://www.itboth.com/d/zUfEJrzMvQFf>
Kinect的三維重建
http://www.itboth.com/d/vM7VJbyyEzea
總結(jié)
- 上一篇: Python LDA主题模型实战
- 下一篇: Win10 + Opencv2.4.9