日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

PCL—点云分割(基于凹凸性) 低层次点云处理

發(fā)布時(shí)間:2025/4/14 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PCL—点云分割(基于凹凸性) 低层次点云处理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

博客轉(zhuǎn)載自:http://www.cnblogs.com/ironstark/p/5027269.html

1.圖像分割的兩條思路

  場(chǎng)景分割時(shí)機(jī)器視覺(jué)中的重要任務(wù),尤其對(duì)家庭機(jī)器人而言,優(yōu)秀的場(chǎng)景分割算法是實(shí)現(xiàn)復(fù)雜功能的基礎(chǔ)。但是大家搞了幾十年也還沒(méi)搞定——不是我說(shuō)的,是接下來(lái)要介紹的這篇論文說(shuō)的。圖像分割的搞法大概有兩種:劍宗——自低向上:先將圖像聚類成小的像素團(tuán)再慢慢合并,氣宗——自頂向下:用多尺度模板分割圖像,再進(jìn)一步將圖像優(yōu)化分割成不同物體。當(dāng)然,還有將二者合而為一的方法:training with data set. 這第三種方法也不好,太依賴于已知的物體而失去了靈活性。家庭機(jī)器人面對(duì)家里越來(lái)越多的東西需要一種非訓(xùn)練且效果很好的分割法。 ?Object Partitioning using Local Convexity?一文的作者從古籍中(也不老,1960s左右吧),找到了一種基于凹凸性的分割方法。實(shí)際上基于凹凸的圖像理解在之前是被研究過(guò)的,但是隨著神經(jīng)網(wǎng)絡(luò)的出現(xiàn),漸漸這種從明確物理意義入手的圖像"理解"方法就被淹沒(méi)了。對(duì)于二維圖像而言,其凹凸性較難描述,但對(duì)于三維圖像而言,凹凸幾乎是與生俱來(lái)的性質(zhì)。

2.LCCP方法 

  LCCP是Locally Convex Connected Patches的縮寫(xiě),翻譯成中文叫做 ”局部凸連接打包一波帶走“~~~算法大致可以分成兩個(gè)部分:1.基于超體聚類的過(guò)分割。2.在超體聚類的基礎(chǔ)上再聚類。超體聚類作為一種過(guò)分割方法,在理想情況下是不會(huì)引入錯(cuò)誤信息的,也就是說(shuō)適合在此基礎(chǔ)上再進(jìn)行處理。關(guān)于超體聚類相關(guān)內(nèi)容見(jiàn)我的博文:超體聚類。 LCCP方法并不依賴于點(diǎn)云顏色,所以只使用空間信息和法線信息,wc=0。ws=1,wn=4。

2.1算法理論

點(diǎn)云完成超體聚類之后,對(duì)于過(guò)分割的點(diǎn)云需要計(jì)算不同的塊之間凹凸關(guān)系。凹凸關(guān)系通過(guò)?CC(Extended Convexity Criterion)?和?SC (Sanity criterion)判據(jù)來(lái)進(jìn)行判斷。其中 CC 利用相鄰兩片中心連線向量與法向量夾角來(lái)判斷兩片是凹是凸。顯然,如果圖中a1>a2則為凹,反之則為凸。

考慮到測(cè)量噪聲等因素,需要在實(shí)際使用過(guò)程中引入門(mén)限值(a1需要比a2大出一定量)來(lái)濾出較小的凹凸誤判。此外,為去除一些小噪聲引起的誤判,還需要引入“第三方驗(yàn)證”,如果某塊和相鄰兩塊都相交,則其凹凸關(guān)系必相同。CC 判據(jù)最終如CCe:

如果相鄰兩面中,有一個(gè)面是單獨(dú)的,cc判據(jù)是無(wú)法將其分開(kāi)的。舉個(gè)簡(jiǎn)單的例子,兩本厚度不同的書(shū)并排放置,視覺(jué)算法應(yīng)該將兩本書(shū)分割開(kāi)。如果是臺(tái)階,則視覺(jué)算法應(yīng)該將臺(tái)階作為一個(gè)整體。本質(zhì)上就是因?yàn)楹穸炔煌臅?shū)存在surface-singularities。為此需要引入SC判據(jù),來(lái)對(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圖像隨深度增加而離散,難以確定八叉樹(shù)尺寸,故在z方向使用對(duì)數(shù)變換以提高精度。分割結(jié)果如圖:

?

從圖中可知,糾纏在一起,顏色形狀相近的物體完全被分割開(kāi)了,如果是圖像分割要達(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ì)于顏色類似但棱角分明的物體可使用該算法。

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

顯而易見(jiàn),某處如果藍(lán)色的點(diǎn)多,那么就越?凹,就越應(yīng)該切開(kāi)(所謂切開(kāi)實(shí)際上是用平面劃分)。問(wèn)題就轉(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è)問(wèn)題,如果這個(gè)分割面過(guò)長(zhǎng)的情況下,有可能會(huì)誤傷。如圖所示:

于是有了第二種修補(bǔ)方法,稱為:Locally constrained cutting

這種修補(bǔ)方法的原理就更加簡(jiǎn)單粗暴了,對(duì)凹點(diǎn)先進(jìn)行歐式分割(限制增長(zhǎng)上限),之后再分割所得的子域里進(jìn)行分割。在修修補(bǔ)補(bǔ)之后,CPC算法終于可以投入使用了,從測(cè)試集的結(jié)果來(lái)看,效果還是很好的。

3.2 PCL的實(shí)現(xiàn)

在PCL中CPC類繼承自 LCCP 類,但是這個(gè)繼承我覺(jué)得不好,這兩個(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/flyinggod/p/8474319.html

總結(jié)

以上是生活随笔為你收集整理的PCL—点云分割(基于凹凸性) 低层次点云处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。