PCL—低层次视觉—点云分割(基于凹凸性)
1.圖像分割的兩條思路
場(chǎng)景分割時(shí)機(jī)器視覺中的重要任務(wù),尤其對(duì)家庭機(jī)器人而言,優(yōu)秀的場(chǎng)景分割算法是實(shí)現(xiàn)復(fù)雜功能的基礎(chǔ)。但是大家搞了幾十年也還沒搞定——不是我說的,是接下來要介紹的這篇論文說的。圖像分割的搞法大概有兩種:劍宗——自低向上:先將圖像聚類成小的像素團(tuán)再慢慢合并,氣宗——自頂向下:用多尺度模板分割圖像,再進(jìn)一步將圖像優(yōu)化分割成不同物體。當(dāng)然,還有將二者合而為一的方法:training with data set. 這第三種方法也不好,太依賴于已知的物體而失去了靈活性。家庭機(jī)器人面對(duì)家里越來越多的東西需要一種非訓(xùn)練且效果很好的分割法。 ?Object Partitioning using Local Convexity 一文的作者從古籍中(也不老,1960s左右吧),找到了一種基于凹凸性的分割方法。實(shí)際上基于凹凸的圖像理解在之前是被研究過的,但是隨著神經(jīng)網(wǎng)絡(luò)的出現(xiàn),漸漸這種從明確物理意義入手的圖像"理解"方法就被淹沒了。對(duì)于二維圖像而言,其凹凸性較難描述,但對(duì)于三維圖像而言,凹凸幾乎是與生俱來的性質(zhì)。
2.LCCP方法
LCCP是Locally Convex Connected Patches的縮寫,翻譯成中文叫做 ”局部凸連接打包一波帶走“~~~算法大致可以分成兩個(gè)部分:1.基于超體聚類的過分割。2.在超體聚類的基礎(chǔ)上再聚類。超體聚類作為一種過分割方法,在理想情況下是不會(huì)引入錯(cuò)誤信息的,也就是說適合在此基礎(chǔ)上再進(jìn)行處理。關(guān)于超體聚類相關(guān)內(nèi)容見我的博文:超體聚類。 LCCP方法并不依賴于點(diǎn)云顏色,所以只使用空間信息和法線信息,wc=0。ws=1,wn=4。
2.1算法理論
點(diǎn)云完成超體聚類之后,對(duì)于過分割的點(diǎn)云需要計(jì)算不同的塊之間凹凸關(guān)系。凹凸關(guān)系通過 CC(Extended Convexity Criterion) 和 SC (Sanity criterion)判據(jù)來進(jìn)行判斷。其中 CC 利用相鄰兩片中心連線向量與法向量夾角來判斷兩片是凹是凸。顯然,如果圖中a1>a2則為凹,反之則為凸。
考慮到測(cè)量噪聲等因素,需要在實(shí)際使用過程中引入門限值(a1需要比a2大出一定量)來濾出較小的凹凸誤判。此外,為去除一些小噪聲引起的誤判,還需要引入“第三方驗(yàn)證”,如果某塊和相鄰兩塊都相交,則其凹凸關(guān)系必相同。CC 判據(jù)最終如CCe:
如果相鄰兩面中,有一個(gè)面是單獨(dú)的,cc判據(jù)是無法將其分開的。舉個(gè)簡(jiǎn)單的例子,兩本厚度不同的書并排放置,視覺算法應(yīng)該將兩本書分割開。如果是臺(tái)階,則視覺算法應(yīng)該將臺(tái)階作為一個(gè)整體。本質(zhì)上就是因?yàn)楹穸炔煌臅嬖趕urface-singularities。為此需要引入SC判據(jù),來對(duì)此進(jìn)行區(qū)分。
如圖所示,相鄰兩面是否真正聯(lián)通,是否存在單獨(dú)面,與θ角有關(guān),θ角越大,則兩面真的形成凸關(guān)系的可能性就越大。據(jù)此,可以設(shè)計(jì)SC判據(jù):
其中S(向量)為兩平面法向量的叉積。
最終,兩相鄰面之間凸邊判據(jù)為:
在標(biāo)記完各個(gè)小區(qū)域的凹凸關(guān)系后,則采用區(qū)域增長(zhǎng)算法將小區(qū)域聚類成較大的物體。此區(qū)域增長(zhǎng)算法受到小區(qū)域凹凸性限制,既:
只允許區(qū)域跨越凸邊增長(zhǎng)。
至此,分割完成,在濾去多余噪聲后既獲得點(diǎn)云分割結(jié)果。此外:考慮到RGB-D圖像隨深度增加而離散,難以確定八叉樹尺寸,故在z方向使用對(duì)數(shù)變換以提高精度。分割結(jié)果如圖:
從圖中可知,糾纏在一起,顏色形狀相近的物體完全被分割開了,如果是圖像分割要達(dá)到這個(gè)效果,那就。。。。。呵呵呵。。。。
?
2.2 PCL的實(shí)現(xiàn)
官網(wǎng)并未給出具體實(shí)現(xiàn)并測(cè)試,我不對(duì)以下代碼有效性負(fù)責(zé)。
1.超體聚類
//設(shè)定結(jié)晶參數(shù)float voxel_resolution = 0.008f;float seed_resolution = 0.1f;float color_importance = 0.2f;float spatial_importance = 0.4f;float normal_importance = 1.0f;//生成結(jié)晶器pcl::SupervoxelClustering<PointT> super (voxel_resolution, seed_resolution);//和點(diǎn)云形式有關(guān)if (disable_transform)super.setUseSingleCameraTransform (false);//輸入點(diǎn)云及結(jié)晶參數(shù) super.setInputCloud (cloud);super.setColorImportance (color_importance);super.setSpatialImportance (spatial_importance);super.setNormalImportance (normal_importance);//輸出結(jié)晶分割結(jié)果:結(jié)果是一個(gè)映射表std::map <uint32_t, pcl::Supervoxel<PointT>::Ptr > supervoxel_clusters;super.extract (supervoxel_clusters);
std::multimap<uint32_t, uint32_t> supervoxel_adjacency; super.getSupervoxelAdjacency (supervoxel_adjacency); 2.LCCP
//生成LCCP分割器 pcl::LCCPSegmentation<PointT>::LCCPSegmentation LCCPseg; //輸入超體聚類結(jié)果 seg.setInputSupervoxels(supervoxel_clusters,supervoxel_adjacency); //CC效驗(yàn)beta值 seg.setConcavityToleranceThreshold (concavity_tolerance_threshold); //CC效驗(yàn)的k鄰點(diǎn) seg.setKFactor (k_factor_arg) // seg.setSmoothnessCheck (bool_use_smoothness_check_arg,voxel_res_arg,seed_res_arg,smoothness_threshold_arg = 0.1); //SC效驗(yàn) seg.setSanityCheck (bool_use_sanity_criterion_arg); //最小分割尺寸 seg.setMinSegmentSize (min_segment_size_arg)seg.segment(); seg.relabelCloud (pcl::PointCloud<pcl::PointXYZL> &labeled_cloud_arg);
綜上所述,LCCP算法在相似物體場(chǎng)景分割方面有著較好的表現(xiàn),對(duì)于顏色類似但棱角分明的物體可使用該算法。(比如X同學(xué)倉庫里那一堆紙箱)
?
3.CPC方法
CPC方法的全稱為Constrained Planar Cuts,出自論文:Constrained Planar Cuts - Object Partitioning for Point Clouds?。和LCCP方法不同,此方法的分割對(duì)象是object。此方法能夠?qū)⑽矬w分成有意義的塊:比如人的肢體等。CPC方法可作為AI的前處理,作為RobotVision還是顯得有些不合適。但此方法不需要額外訓(xùn)練,自底向上的將三維圖像分割 成有明確意義部分,是非常admirable的。
3.1 CPC方法原理
和其他基于凹凸性的方法相同,本方法也需要先進(jìn)行超體聚類。在完成超體聚類之后,采用和LCCP相同的凹凸性判據(jù)獲得各個(gè)塊之間的凹凸關(guān)系。在獲得凹凸性之后,CPC方法所采取的措施是不同的。其操作稱為 半全局分割?
在分割之前,首先需要生成 EEC(Euclidean edge cloud),?EEC的想法比較神奇,因?yàn)榘纪剐远x在相鄰兩個(gè)”片“上,換言之,定義在連接相鄰兩“片”的edge上。將每個(gè)edge抽象成一個(gè)點(diǎn)云,則得到了附帶凹凸信息的點(diǎn)云。如圖所示,左圖是普通點(diǎn)云,但附帶了鄰接和凹凸信息。右邊是EEC,對(duì)凹邊賦權(quán)值1,其他為0。
? ? ? 此方法稱作 ?weighted RanSac
顯而易見,某處如果藍(lán)色的點(diǎn)多,那么就越 凹,就越應(yīng)該切開(所謂切開實(shí)際上是用平面劃分)。問題就轉(zhuǎn)化為利用藍(lán)點(diǎn)求平面了。利用點(diǎn)云求一個(gè)最可能的平面當(dāng)然需要請(qǐng)出我們的老朋友 RanSaC?.?但此處引入一個(gè)評(píng)價(jià)函數(shù),用于評(píng)價(jià)此次分割的 優(yōu)良程度Sm,Pm 是EEC中的點(diǎn).
單純的weighted RanSac算法并不夠。其會(huì)導(dǎo)致對(duì)某些圖形的錯(cuò)誤分割,所以作者對(duì)此做了第一次“修補(bǔ)".錯(cuò)誤的分割如下圖所示
此修補(bǔ)方法稱作 directional weighted RanSac
方法的原理很簡(jiǎn)單,垂直于凹邊表面的點(diǎn)具有更高的權(quán)重,顯然,對(duì)于EEC中的凹點(diǎn),只要取其少量鄰點(diǎn)即可估計(jì)垂直方向。
這種修補(bǔ)后還有一個(gè)問題,如果這個(gè)分割面過長(zhǎng)的情況下,有可能會(huì)誤傷。如圖所示:
于是有了第二種修補(bǔ)方法,稱為:Locally constrained cutting
這種修補(bǔ)方法的原理就更加簡(jiǎn)單粗暴了,對(duì)凹點(diǎn)先進(jìn)行歐式分割(限制增長(zhǎng)上限),之后再分割所得的子域里進(jìn)行分割。
在修修補(bǔ)補(bǔ)之后,CPC算法終于可以投入使用了,從測(cè)試集的結(jié)果來看,效果還是很好的。
3.2 PCL的實(shí)現(xiàn)
在PCL中CPC類繼承自 LCCP 類,但是這個(gè)繼承我覺得不好,這兩個(gè)類之間并不存在抽象與具體的關(guān)系,只是存在某些函數(shù)相同而已。不如多設(shè)一個(gè) 凹凸分割類 作為CPC類與LCCP類的父類,所有的輸入接口等都由凹凸分割類提供。由CPC算法和LCCP算法繼承凹凸類,作為 凹凸分割 的具體實(shí)現(xiàn)。畢竟和 凹凸分割 有關(guān)的算法多半是對(duì)整體進(jìn)行分割,和其他點(diǎn)云分割算法區(qū)別較大。
//生成CPC分割器 pcl::CPCSegmentation<PointT>::CPCSegmentation seg; //輸入超體聚類結(jié)果 seg.setInputSupervoxels(supervoxel_clusters,supervoxel_adjacency); //設(shè)置分割參數(shù) setCutting (max_cuts = 20,cutting_min_segments = 0,cutting_min_score = 0.16,locally_constrained = true,directed_cutting = true,clean_cutting = false); seg.setRANSACIterations (ransac_iterations); seg.segment(); seg.relabelCloud (pcl::PointCloud<pcl::PointXYZL> &labeled_cloud_arg);
?
轉(zhuǎn)載于:https://www.cnblogs.com/ironstark/p/5027269.html
總結(jié)
以上是生活随笔為你收集整理的PCL—低层次视觉—点云分割(基于凹凸性)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring3.3 整合 Hiberna
- 下一篇: 求一个口是心非的个性签名!