参考
【C++】pcl中的Region Growing(区域生长)算法
区域生长的原理
1、排序,基于曲率对点云进行排序,曲率最小的点叫做初始种子点,区域生长算法从曲率最小的种子点开始生长,初始种子点所在区域为最平滑区域,从初始种子点所在的区域开始生长可减小分割片段的总数,从而提高算法的效率。
2、设置一个种子集合Q,聚类区域C,对种子点的邻域点进行分析,如果和种子点的法向量差值小于阈值,就把这个点放到C中;再计算曲率,若小于曲率阈值,就把这个点放入到Q中。对邻域计算完后再种子点的集合Q中剔除原来的种子点。
3、若Q非空,则重复2(找种子点的邻域点,进行判断)。直到Q为空集合。
论文
PCL封装的效果
matlab实现代码
------------------------------------------------------------
更新:2020-1-15
思路比较简单,pcl的代码实在看不下去,便参考了二维图像的区域生长分割,采用最简单的一种方法:手工指定一个初始种子点,在matlab中给出了实现
-------------------------------------------------------------
主函数building_Example2_Region_Grow_Segment.m
% 读取txt文件,将txt文件保存为pcd文件并以点云的格式显示
clear;clear all;close all;
pt=pcread('region_growing_tutorial.pcd');
pcData=pt.Location;
% pcData=load('building_Example2.txt');
% pcData=load('Building1.txt');
color=zeros(size(pcData,1),3);
pcData=[pcData color];
ptCloud = pointCloud(pcData(:,1:1:3),'Color',pcData(:,4:1:6));%读取txt文件的坐标信息以及颜色信息
% ptCloud = pointCloud(pcData(:,1:1:3));%读取txt文件的坐标信息
pcwrite(ptCloud, 'building_Example2_color.pcd', 'Encoding', 'ascii'); %将程序中的xyz数据写入pcd文件中
% pc = pcread('building_Example2_color.pcd');
pcshow(ptCloud); %显示点云
view(-37.5,30);
% 计算法向量
normals=pcnormals(ptCloud,10);
%2020-1-9
%使用PCA计算法向量和曲率pw
k=8;%近邻点数量为8
[pn,pw]