(結構光)單目+結構光三維重構總體結構

博主是那種動手能力較差的人(超級容易踩坑,一個坑踩超級久),獨自搭建一個單目+結構光系統是真的挺挑戰的。
在自己做的過程中,最讓人心累的就是,我結果不好的話,會認爲是投影儀不夠好才標定出問題的bulabulabula…,基本上卡着我的點都是諸如“怎麼從投影儀投射一張正常的圖片”這種讓大佬們感覺很低級的問題。其實我的確很容易被所謂“低級問題”卡住,這也是需要進步的一個點。
本次實驗主要參考了這位博主的3D重構系列博客。

相機+投影儀

相機是從包工頭那裏拿的MindVision,投影儀是博主還是白的時候從京東買的一個200多的“家庭影院”投影儀,物理分辨率800*480。聽說別人用的都是幾千塊的投影儀,我的200塊,我……是有點怕的。

系統標定

包括兩個部分,相機標定和投影儀標定。OpenCV和MATLAB都有對應的標定工具,由於我使用的C++,所以用的OpenCV標定。標定過相機的夥伴可能對相機標定已經不陌生了,那麼系統標定主要是投影儀怎麼標定了。
OpenCV標定將投影儀看做一個相機模型,使用棋盤格進行標定。且只要知道了投影儀圖片的角點座標+角點座標對應的世界座標就能夠對投影儀進行標定了。
具體操作堅持一個原則:保證打印棋盤格(用於相機的標定)和投影棋盤格在同一個平面上(對我來說比較難的是採集圖片,我苦於沒有準備好白板,標定的事情拖了好久好久)。採集圖片時,保持相機與投影儀的相對位姿不變,改變白板與相機+投影儀系統的相對位姿,使用相機採集圖片。
新手疑問1:打印棋盤格和投影棋盤格怎麼擺?如圖,相互不交叉,且角點個數不一樣就可以了,保證角點個數不一樣是爲了在運行程序的時候區分是打印的其棋盤格還是投影的棋盤格(也就是標定的是相機還是投影儀)
在這裏插入圖片描述
新手疑問2:投影儀世界座標和圖片座標怎麼得到?系統首先標定相機,標定相機之後,提取上圖中投影棋盤格的角點並計算這些角點的世界座標(投影儀的世界座標get);投影用的那張圖片相當於投影儀相機模型中“相機採集到的圖片”,提取角點就得到了標定中需要的圖片角點座標。然後就可以標定了。
新手疑問3:如何確定相機和投影儀的位姿?我看的以篇論文中提到,標定時得到相機RT,投影儀RT每一組都能夠用作重構,對應的只是選擇了不同的世界座標系而已。對於重構結果沒有本質上的影響。
新手疑問4:如果不小心動了投影儀和相機怎麼辦?動了就擺回去嘍。。。擺不回去的話,內參無需重新標定,只需要重新標定外參就可以了。新手可以參考OpenCV中的函數solvePnPRansac(),這個函數就是知道了角點的世界座標和圖片座標和相機內參和畸變係數能夠得到相機相對於世界座標系的RT的函數。這個函數真是太妙了。
我在標定這裏踩了比較多的坑,最最最大的坑就是,我不知道使用多大的圖片合適。可能第一次標定用的投影圖片得到的結果也能用吧,但是我的測試結果不太好。最好就是採用與自己的投影儀物理分辨率一致的圖片

三維重構原理

單目+結構光系統的原理與雙目原理一樣,只要找到了兩張圖片之間的像素對應關係+標定結果就能三角測量了。唯一的不同點就是尋找對應像素的方式不同。雙目系統直接運行對應的算法就可以了,例如OpenCV中的SGBM算法。單目+結構光妙在結構光,通過對結構光進行編碼、解碼,得到像素之間的對應關係。我的投影儀正弦性不是很好,所以,我用的格雷碼,這也是我參考開頭那位博主的方法的原因。
在系統已經標定好的前提下,通過相機採集一批圖片,然後對圖片進行二值化,得到每個圖片每個像素的格雷碼,對格雷碼解碼之後得到的就是像素在“投影儀採集的(投影圖片)圖片中的位置”,如此一來,我們就得到了兩張圖片之間的像素對應關係,加上前邊的標定結果,直接對“對應像素”進行三角測量就可以了。

我是不是寫的太大白話了。。。

測試重構一個白色的方塊
在這裏插入圖片描述
通過MATLAB中表示的結果,能夠發現,點雲分層,方塊的上表面與白板分開。說明總體原理實現是正確的。
在這裏插入圖片描述
下一步應該是對點雲中的離羣點進行剔除。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章