天天看点

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