天天看點

PCL—低層次視覺—點雲分割(RanSaC)

<!DOCTYPE html>
<html >
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>PCL—低層次視覺—點雲分割(RanSaC) - IronStark - 部落格園</title>
<link type="text/css" rel="stylesheet" href="/bundles/blog-common.css?v=ON3Mxdo4-HlSMqbNDBZXhFIcGLon3eZDvU8zBESgwkk1" target="_blank" rel="external nofollow" />
<link id="MainCss" type="text/css" rel="stylesheet" href="/skins/CodingLife/bundle-CodingLife.css?v=g4Oce5UBaUn_FUwadcT09ICEg5NkULQGtUpNhTtrI8U1" target="_blank" rel="external nofollow" />
<link id="mobile-style" media="only screen and (max-width: 767px)" type="text/css" rel="stylesheet" href="/skins/CodingLife/bundle-CodingLife-mobile.css?v=Xay8b9tTSw814nBzbOgvS6rrbcxrobMhvHJHdZAO9vI1" target="_blank" rel="external nofollow" />
<link title="RSS" type="application/rss+xml" rel="alternate" href="http://www.cnblogs.com/ironstark/rss" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" />
<link title="RSD" type="application/rsd+xml" rel="EditURI" href="http://www.cnblogs.com/ironstark/rsd.xml" target="_blank" rel="external nofollow" />
<link type="application/wlwmanifest+xml" rel="wlwmanifest" href="http://www.cnblogs.com/ironstark/wlwmanifest.xml" target="_blank" rel="external nofollow" />
<script src="//common.cnblogs.com/scripts/jquery-2.2.0.min.js"></script>
<script type="text/javascript">var currentBlogApp = 'ironstark', cb_enable_mathjax=true;var isLogined=false;</script>
<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
        tex2jax: { inlineMath: [['$','$'], ['\\(','\\)']], processClass: 'blogpost-body', processEscapes: true },
        TeX: { 
            equationNumbers: { autoNumber: ['AMS'], useLabelIds: true }, extensions: ['extpfeil.js'] },
            'HTML-CSS': { linebreaks: { automatic: true } },
            SVG: { linebreaks: { automatic: true } }
        });
    </script><script src="//mathjax.cnblogs.com/2_7_2/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script src="/bundles/blog-common.js?v=O-NTEmnhjbG7lSYLc3yeqkrVxfMJyY9iXf4xyjlKikw1" type="text/javascript"></script>
</head>
<body>
<a name="top"></a>

<!--done-->
<div id="home">
<div id="header">
	<div id="blogTitle">
	<a id="lnkBlogLogo" href="http://www.cnblogs.com/ironstark/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" ><img id="blogLogo" src="/Skins/custom/images/logo.gif" alt="傳回首頁" /></a>			
		
<!--done-->
<h1><a id="Header1_HeaderTitle" class="headermaintitle" href="http://www.cnblogs.com/ironstark/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >IronStark</a></h1>
<h2>Ph.D Candidate, HUST.
Visiting Research Student, UBC.</h2>



		
	</div><!--end: blogTitle 部落格的标題和副标題 -->
	<div id="navigator">
		
<ul id="navList">
<li><a id="blog_nav_sitehome" class="menu" href="http://www.cnblogs.com/" target="_blank" rel="external nofollow" >部落格園</a></li>
<li><a id="blog_nav_myhome" class="menu" href="http://www.cnblogs.com/ironstark/" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >首頁</a></li>
<li><a id="blog_nav_newpost" class="menu" rel="nofollow" href="https://i.cnblogs.com/EditPosts.aspx?opt=1" target="_blank" rel="external nofollow" >新随筆</a></li>
<li><a id="blog_nav_contact" class="menu" rel="nofollow" href="https://msg.cnblogs.com/send/IronStark" target="_blank" rel="external nofollow" >聯系</a></li>
<li><a id="blog_nav_rss" class="menu" href="http://www.cnblogs.com/ironstark/rss" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" >訂閱</a>
<!--<a id="blog_nav_rss_image" class="aHeaderXML" href="http://www.cnblogs.com/ironstark/rss" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" ><img src="//www.cnblogs.com/images/xml.gif" alt="訂閱" /></a>--></li>
<li><a id="blog_nav_admin" class="menu" rel="nofollow" href="https://i.cnblogs.com/" target="_blank" rel="external nofollow" >管理</a></li>
</ul>
		<div class="blogStats">
			
			<div id="blog_stats">
<span id="stats_post_count">随筆 - 97  </span>
<span id="stats_article_count">文章 - 1  </span>
<span id="stats-comment_count">評論 - 82</span>
</div>
			
		</div><!--end: blogStats -->
	</div><!--end: navigator 部落格導航欄 -->
</div><!--end: header 頭部 -->

<div id="main">
	<div id="mainContent">
	<div class="forFlow">
		
<div id="post_detail">
<!--done-->
<div id="topics">
	<div class = "post">
		<h1 class = "postTitle">
			<a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/ironstark/p/4998037.html" target="_blank" rel="external nofollow" >PCL—低層次視覺—點雲分割(RanSaC)</a>
		</h1>
		<div class="clear"></div>
		<div class="postBody">
			<div id="cnblogs_post_body" class="blogpost-body"><h1>點雲分割</h1>
<p>  點雲分割可謂點雲處理的精髓,也是三維圖像相對二維圖像最大優勢的展現。不過多插一句,自Niloy J Mitra教授的<a class="gsc_title_link" href="http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=6871397" target="_blank" rel="external nofollow"  target="_blank" data-clk="hl=zh-CN&sa=T&ei=Wq1WVqTWHY3UjAGH46HQAQ">Global contrast based salient region detection</a>出現,最優分割到底鹿死誰手還不好說。暫且不論他開挂的圖像處理算法,先安心做一個PCL吹~</p>
<p>  點雲分割的目的提取點雲中的不同物體,進而實作分而治之,突出重點,單獨處理的目的。而在現實點雲資料中,往往對場景中的物體有一定先驗知識。比如:桌面牆面多半是大平面,桌上的罐子應該是圓柱體,長方體的盒子可能是牛奶盒......對于複雜場景中的物體,其幾何外形可以歸結于簡單的幾何形狀。這為分割帶來了巨大的便利,因為簡單幾何形狀是可以用方程來描述的,或者說,可以用有限的參數來描述複雜的物體。而方程則代表的物體的拓撲抽象。于是,RanSaC算法可以很好的将此類物體分割出來。</p>
<h1>RanSaC算法</h1>
<p>  RanSaC算法(随機采樣一緻)原本是用于資料處理的一種經典算法,其作用是在大量噪聲情況下,提取物體中特定的成分。下圖是對RanSaC算法效果的說明。圖中有一些點顯然是滿足某條直線的,另外有一團點是純噪聲。目的是在大量噪聲的情況下找到直線方程,此時噪聲資料量是直線的3倍。</p>
<p style="text-align: center;"><img src="https://images2015.cnblogs.com/blog/710098/201511/710098-20151126151204093-192284535.jpg" alt="" /></p>
<p style="text-align: left;">  如果用最小二乘法是無法得到這樣的效果的,直線大約會在圖中直線偏上一點。關于随機采樣一緻性算法的原理,在wiki百科上講的很清楚,甚至給出了僞代碼和matlab,C代碼。見網址https://en.wikipedia.org/wiki/RANSAC. 我想換一個不那麼嚴肅或者說不那麼學術的方式來解釋這個算法。</p>
<p style="text-align: left;">  實際上這個算法就是從一堆資料裡挑出自己最心儀的資料。所謂心儀當然是有個标準(目标的形式:滿足直線方程?滿足圓方程?以及能容忍的誤差e)。平面中确定一條直線需要2點,确定一個圓則需要3點。随機采樣算法,其實就和小女生找男朋友差不多。</p>
<ol>
<li style="text-align: left;">從人群中随便找個男生,看看他條件怎麼樣,然後和他談戀愛,(平面中随機找兩個點,拟合一條直線,并計算在容忍誤差e中有多少點滿足這條直線)</li>
<li style="text-align: left;">第二天,再重新找個男生,看看他條件怎麼樣,和男朋友比比,如果更好就換新的(重新随機選兩點,拟合直線,看看這條直線是不是能容忍更多的點,如果是則記此直線為結果)</li>
<li style="text-align: left;">第三天,重複第二天的行為(循環疊代)</li>
<li style="text-align: left;">終于到了某個年齡,和現在的男朋友結婚(疊代結束,記錄目前結果)</li>
</ol>
<p>  顯然,如果一個女生按照上面的方法找男朋友,最後一定會嫁一個好的(我們會得到心儀的分割結果)。隻要這個模型在直覺上存在,該算法就一定有機會把它找到。優點是噪聲可以分布的任意廣,噪聲可以遠大于模型資訊。</p>
<p>  這個算法有兩個缺點,第一,必須先指定一個合适的容忍誤差e。第二,必須指定疊代次數作為收斂條件。</p>
<p>  綜合以上特性,本算法非常适合從雜亂點雲中檢測某些具有特殊外形的物體。</p>
<h1>PCL中基于RanSaC的點雲分割方法</h1>
<p>  PCL支援了大量幾何模型的RanSaC檢測,可以非常友善的對點雲進行分割。其調用方法如下:</p>
<p>  </p>
<div class="cnblogs_code">
<pre>  <span style="color: #008000;">//</span><span style="color: #008000;">建立一個模型參數對象,用于記錄結果</span>
  pcl::ModelCoefficients::Ptr coefficients (<span style="color: #0000ff;">new</span><span style="color: #000000;"> pcl::ModelCoefficients);
  </span><span style="color: #008000;">//</span><span style="color: #008000;">inliers表示誤差能容忍的點 記錄的是點雲的序号</span>
  pcl::PointIndices::Ptr inliers (<span style="color: #0000ff;">new</span><span style="color: #000000;"> pcl::PointIndices);
  </span><span style="color: #008000;">//</span><span style="color: #008000;"> 建立一個分割器</span>
  pcl::SACSegmentation<pcl::PointXYZ><span style="color: #000000;"> seg;
  </span><span style="color: #008000;">//</span><span style="color: #008000;"> Optional</span>
  seg.setOptimizeCoefficients (<span style="color: #0000ff;">true</span><span style="color: #000000;">);
  </span><span style="color: #008000;">//</span><span style="color: #008000;"> Mandatory-設定目标幾何形狀</span>
<span style="color: #000000;">  seg.setModelType (pcl::SACMODEL_PLANE);
  </span><span style="color: #008000;">//</span><span style="color: #008000;">分割方法:随機采樣法</span>
<span style="color: #000000;">  seg.setMethodType (pcl::SAC_RANSAC);
  </span><span style="color: #008000;">//</span><span style="color: #008000;">設定誤差容忍範圍</span>
  seg.setDistanceThreshold (<span style="color: #800080;">0.01</span><span style="color: #000000;">);
  </span><span style="color: #008000;">//</span><span style="color: #008000;">輸入點雲</span>
<span style="color: #000000;">  seg.setInputCloud (cloud);
  </span><span style="color: #008000;">//</span><span style="color: #008000;">分割點雲</span>
  seg.segment (*inliers, *coefficients);</pre>
</div>
<p>  除了平面以外,PCL幾乎支援所有的幾何形狀。作為點雲分割的基礎算法,RanSaC很強大且必收斂,可以作為機器人抓取,識别等後續任務的前處理。</p></div><div id="MySignature"></div>
<div class="clear"></div>
<div id="blog_post_info_block">
<div id="BlogPostCategory"></div>
<div id="EntryTag"></div>
<div id="blog_post_info">
</div>
<div class="clear"></div>
<div id="post_next_prev"></div>
</div>


		</div>
		<div class = "postDesc">posted @ <span id="post-date">2015-11-26 16:02</span> <a href='http://www.cnblogs.com/ironstark/'>IronStark</a> 閱讀(<span id="post_view_count">...</span>) 評論(<span id="post_comment_count">...</span>)  <a href ="https://i.cnblogs.com/EditPosts.aspx?postid=4998037" rel="nofollow">編輯</a> <a href="#" target="_blank" rel="external nofollow"  οnclick="AddToWz(4998037);return false;">收藏</a></div>
	</div>
	<script type="text/javascript">var allowComments=true,cb_blogId=246758,cb_entryId=4998037,cb_blogApp=currentBlogApp,cb_blogUserGuid='64209f10-d393-e411-b908-9dcfd8948a71',cb_entryCreatedDate='2015/11/26 16:02:00';loadViewCount(cb_entryId);var cb_postType=1;</script>
	
</div><!--end: topics 文章、評論容器-->
</div><a name="!comments"></a><div id="blog-comments-placeholder"></div><script type="text/javascript">var commentManager = new blogCommentManager();commentManager.renderComments(0);</script>
<div id='comment_form' class='commentform'>
<a name='commentform'></a>
<div id='divCommentShow'></div>
<div id='comment_nav'><span id='span_refresh_tips'></span><a href='javascript:void(0);' οnclick='return RefreshCommentList();' id='lnk_RefreshComments' runat='server' clientidmode='Static'>重新整理評論</a><a href='#' οnclick='return RefreshPage();'>重新整理頁面</a><a href='#top'>傳回頂部</a></div>
<div id='comment_form_container'></div>
<div class='ad_text_commentbox' id='ad_text_under_commentbox'></div>
<div id='ad_t2'></div>
<div id='opt_under_post'></div>
<div id='cnblogs_c1' class='c_ad_block'></div>
<div id='under_post_news'></div>
<div id='cnblogs_c2' class='c_ad_block'></div>
<div id='under_post_kb'></div>
<div id='HistoryToday' class='c_ad_block'></div>
<script type='text/javascript'>
    fixPostBody();
    setTimeout(function () { incrementViewCount(cb_entryId); }, 50);
    deliverAdT2();
    deliverAdC1();
    deliverAdC2();    
    loadNewsAndKb();
    loadBlogSignature();
    LoadPostInfoBlock(cb_blogId, cb_entryId, cb_blogApp, cb_blogUserGuid);
    GetPrevNextPost(cb_entryId, cb_blogId, cb_entryCreatedDate, cb_postType);
    loadOptUnderPost();
    GetHistoryToday(cb_blogId, cb_blogApp, cb_entryCreatedDate);   
</script>
</div>


	</div><!--end: forFlow -->
	</div><!--end: mainContent 主體内容容器-->

	<div id="sideBar">
		<div id="sideBarMain">
			
<!--done-->
<div class="newsItem">
<h3 class="catListTitle">公告</h3>
	<div id="blog-news"></div><script type="text/javascript">loadBlogNews();</script>
</div>

			<div id="blog-calendar" style="display:none"></div><script type="text/javascript">loadBlogDefaultCalendar();</script>
			
			<div id="leftcontentcontainer">
				<div id="blog-sidecolumn"></div><script type="text/javascript">loadBlogSideColumn();</script>
			</div>
			
		</div><!--end: sideBarMain -->
	</div><!--end: sideBar 側邊欄容器 -->
	<div class="clear"></div>
	</div><!--end: main -->
	<div class="clear"></div>
	<div id="footer">
		
<!--done-->
Copyright &copy;2018 IronStark
	</div><!--end: footer -->
</div><!--end: home 自定義的最大容器 -->
</body>
</html>
           

轉載自:

PCL—低層次視覺—點雲分割(RanSaC) - IronStark - 部落格園  http://www.cnblogs.com/ironstark/p/4998037.html