1、原理介绍
成对连接点云分割是对点云进行分割,其将点云进行聚类,基本将点分成平面点、单个点。其流程包括:
(1)点特征计算:平整度
(2)成对连接构建:使用点及其近邻点
(3)使用成对连接获取初始聚类结果
(4)合并过程合并初始结果
2、点云分割效果
2.1、数据一:
2.1、数据二:
从提取的时间上看,效率基本还可以,但可以发现对于面面交界处点效果不是那么理想,仍需要进一步优化。
3、环境配置
配置OpenCV,具体配置环境可参考博客:
https://blog.csdn.net/qq_32867925/article/details/106387252
4、主函数介绍
在这里插入代码片void main()
{
clock_t t1, t2;
t1 = clock();
std::string fileData = "..\\alidar.txt";
std::string fileResult = "..\\alidar_result.txt";
// step1: read in data
PointCloud<double> pointData;
readDataFromFile(fileData, pointData);
// step2: build kd-tree
int k = 100;
std::vector<PCAInfo> pcaInfos;
PCAFunctions pcaer;
pcaer.PCA(pointData, 100, pcaInfos);//近邻点个数
// step3: run point segmentation algorithm
int algorithm = 0;
std::vector<std::vector<int>> clusters;
// Algorithm1: segmentation via PLinkage based clustering
if (algorithm == 0)
{
double theta = 90.0 / 180.0 * CV_PI;
PLANE_MODE planeMode = SURFACE; // PLANE SURFACE
ClusterGrowPLinkage segmenter(k, theta, planeMode);
segmenter.setData(pointData, pcaInfos);
segmenter.run(clusters);
}
// Algorithm2: segmentation via normal angle similarity
else if (algorithm == 1)
{
double theta = 5.0 / 180.0 * CV_PI;
double percent = 0.75;
PointGrowAngleOnly segmenter(theta, percent);
segmenter.setData(pointData, pcaInfos);
segmenter.run(clusters);
}
// Algorithm3: segmentation via normal angle similarity and point-plane distance
else
{
double theta = 10.0 / 180.0 * CV_PI;
int RMin = 10; // minimal number of points per cluster
PointGrowAngleDis segmenter(theta, RMin);
segmenter.setData(pointData, pcaInfos);
segmenter.run(clusters);
}
// step4: write out result
writeOutClusters(fileResult, pointData, clusters);
t2 = clock();
cout << "time consuming is " << (t2 - t1) / 1000 << "s" << endl;
system("pause");
}
5、下载链接
链接:https://pan.baidu.com/s/1FFLSbYHoX9bEsZZn07CKJA
提取码:5c29