????????halcon中的三維匹配大致分為兩類(lèi),一類(lèi)是基于形狀的(Shape-Based),一類(lèi)是基于表面的(Surface-Based)?;谛螤畹钠ヅ淇捎糜趩蝹€(gè)2D圖像中定位復(fù)雜的3D物體,3D物體模型必須是CAD模型,且?guī)缀芜吘壡逦梢?jiàn),使用的相機(jī)也要預(yù)先進(jìn)行校準(zhǔn)。基于表面的匹配可用于3D場(chǎng)景中快速定位復(fù)雜的3D物體,比如在點(diǎn)云中尋找物體,模型可以從CAD或3D傳感器中獲得,可以包含光滑的表面,基于表面的匹配也稱(chēng)為“體積匹配”。
halcon中的surface matching
? ? ? ? halcon中surface matching參考文獻(xiàn)為:Model Globally, Match Locally: Efficient and Robust 3D Object Recognition,該方法已申請(qǐng)專(zhuān)利。通常我們只要知道模型中的三個(gè)點(diǎn),以及其在場(chǎng)景中對(duì)應(yīng)的三個(gè)點(diǎn)就可以確定位姿,如果每個(gè)點(diǎn)都有一個(gè)方向,那么只需要一組對(duì)應(yīng)點(diǎn)和轉(zhuǎn)動(dòng)角度就能確定位姿。文獻(xiàn)中定義了PPF(point pair feature)這樣的特征矢量,在創(chuàng)建模板時(shí)計(jì)算每個(gè)特征點(diǎn)與其他特征點(diǎn)的PPF,構(gòu)建哈希表,將具有相同 feature 的 point pair 放在一起,在匹配時(shí)從場(chǎng)景中選取一部分關(guān)鍵點(diǎn),將每個(gè)關(guān)鍵點(diǎn)與其他場(chǎng)景點(diǎn)計(jì)算PPF,根據(jù)存儲(chǔ)好的哈希表對(duì)模型點(diǎn)和轉(zhuǎn)動(dòng)角度進(jìn)行反向投票,超過(guò)設(shè)定分?jǐn)?shù)就認(rèn)為找到了模型的point pair,根據(jù)模型點(diǎn)和轉(zhuǎn)動(dòng)角度算出變換矩陣得到初始位姿,再用ICP求精。
? ? ? ? 基于PPF的surface matching網(wǎng)上有很多文章,GitHub上有很多開(kāi)源實(shí)現(xiàn),opencv中也實(shí)現(xiàn)了該算法,對(duì)于算法的原理我不再詳細(xì)展開(kāi),感興趣的可以自己查找相關(guān)資料。這里只談一下我的實(shí)現(xiàn)過(guò)程及所遇到的問(wèn)題。
模型點(diǎn)云
? ? ? ? 首先是模型訓(xùn)練,最主要的問(wèn)題是點(diǎn)云降采樣,降采樣可以加速計(jì)算,并且避免一些很接近的點(diǎn),在點(diǎn)云匹配過(guò)程也需要對(duì)場(chǎng)景進(jìn)行降采樣,點(diǎn)云的降采樣有兩種辦法,一種是使用kdtree,一種是使用octree,目前兩種方法我還在對(duì)比中,降采樣之后的PPF計(jì)算,需要限制兩個(gè)點(diǎn)的距離和法向量夾角,夾角超過(guò)30度都會(huì)保留,計(jì)算好后保存至本地。
模型點(diǎn)云(降采樣后)
? ? ? ? 第二步是模型匹配,先對(duì)場(chǎng)景點(diǎn)降采樣,之后選取一定比例的場(chǎng)景點(diǎn)作為關(guān)鍵點(diǎn),然后計(jì)算每個(gè)關(guān)鍵點(diǎn)與其他場(chǎng)景點(diǎn)的PPF,根據(jù)模型訓(xùn)練時(shí)保存的哈希表對(duì)模型點(diǎn)和轉(zhuǎn)動(dòng)角度進(jìn)行投票,如果票數(shù)高于設(shè)定值,保存關(guān)鍵點(diǎn)、模型點(diǎn)與轉(zhuǎn)動(dòng)角度,并計(jì)算變換矩陣,該矩陣即為模型點(diǎn)對(duì)應(yīng)關(guān)鍵點(diǎn)的位姿。值得注意的是計(jì)算PPF時(shí)要以關(guān)鍵點(diǎn)為圓心,選取指定半徑范圍內(nèi)的場(chǎng)景點(diǎn),因?yàn)榫嚯x太遠(yuǎn)的兩個(gè)點(diǎn)不可能處在同一物體上,在Going Further with Point Pair Features這篇文章就指出使用一大一小兩個(gè)voting ball做兩輪投票,大小半徑由bounding box確定。
? ? ? ? 第三步是位姿聚類(lèi),上一步中得到了很多位姿,這里我們要進(jìn)行兩次聚類(lèi),第一次是針對(duì)一個(gè)參考點(diǎn)對(duì)應(yīng)多個(gè)位姿,第二次是針對(duì)一個(gè)位姿對(duì)應(yīng)多個(gè)參考點(diǎn),兩種情況下都需要合并,第一次聚類(lèi)將位姿轉(zhuǎn)換為axis-angle+translate的形式,通過(guò)旋轉(zhuǎn)角度和平移量判斷是否為同類(lèi),第二次聚類(lèi)將位姿轉(zhuǎn)換為rotation+translate的形式,直接對(duì)模型的box center進(jìn)行旋轉(zhuǎn)+平移,如果變換后的點(diǎn)非常接近,直接合并。
? ? ? ? 第四步是點(diǎn)云配準(zhǔn),即ICP pose refinement,以第三步得到的位姿作為初始值,在場(chǎng)景點(diǎn)中尋找模型點(diǎn)的最近點(diǎn),根據(jù)距離和方向確定對(duì)應(yīng)關(guān)系,由新的點(diǎn)對(duì)計(jì)算新的位姿,再以新的位姿進(jìn)行下一次計(jì)算,迭代至收斂或發(fā)散。對(duì)于收斂的結(jié)果重新進(jìn)行評(píng)分,落在模型上的點(diǎn)越多,分?jǐn)?shù)越高。在配準(zhǔn)過(guò)程中找到正確的對(duì)應(yīng)點(diǎn)以及使用穩(wěn)健的icp非常關(guān)鍵,對(duì)應(yīng)點(diǎn)的查找我們借助kdtree或者octree,icp使用robust symmetric icp。
? ? ? ? 目前的速度和精度還可以,可視化是在cloudcompare中完成,后續(xù)我會(huì)發(fā)布測(cè)試demo,對(duì)于位姿篩選、ICP算法、投票過(guò)程,我會(huì)繼續(xù)深入研究,也歡迎大家與我討論。
匹配結(jié)果1文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-847718.html
匹配結(jié)果2文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-847718.html
到了這里,關(guān)于3D Matching:實(shí)現(xiàn)halcon中的find_surface_model的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!