CloudCompare——点云空间圆拟合

目录

  • 1.概述
  • 2.软件实现
  • 3.完整操作
  • 4.算法源码
  • 5.相关代码

在这里插入图片描述

本文由CSDN点云侠原创,CloudCompare——点云空间圆拟合,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。

1.概述

   CloudCompare软件中的'Tools——>Fit——>Circle功能可以实现点云的空间圆拟合。

2.软件实现

1. 首先选中点云
CloudCompare——点云空间圆拟合_第1张图片

2. 拟合功能
CloudCompare——点云空间圆拟合_第2张图片

3. 拟合结果
白色的线为拟合出来的空间圆模型
CloudCompare——点云空间圆拟合_第3张图片

4. 拟合参数
CloudCompare——点云空间圆拟合_第4张图片

5. 修改拟合圆的颜色
选中拟合的空间圆模型使用Edit中的Colors功能即可对拟合结果进行颜色修改。
CloudCompare——点云空间圆拟合_第5张图片

3.完整操作

4.算法源码

void MainWindow::doActionFitCircle()
{
	ccProgressDialog pDlg(true, this);
	pDlg.setAutoClose(false);

	for (ccHObject* entity : getSelectedEntities())
	{
		ccPointCloud* cloud = ccHObjectCaster::ToPointCloud(entity);
		if (!cloud)
			continue;

		CCVector3 center;
		CCVector3 normal;
		PointCoordinateType radius = 0;
		double rms = std::numeric_limits<double>::quiet_NaN();
		if (CCCoreLib::GeometricalAnalysisTools::DetectCircle(	cloud,
																center,
																normal,
																radius,
																rms,
																&pDlg) != CCCoreLib::GeometricalAnalysisTools::NoError)
		{
			ccLog::Warning(tr("[Fit circle] Failed to fit a circle on cloud '%1'").arg(cloud->getName()));
			continue;
		}

		ccLog::Print(tr("[Fit circle] Cloud '%1': center (%2,%3,%4) - radius = %5 [RMS = %6]")
						.arg(cloud->getName())
						.arg(center.x)
						.arg(center.y)
						.arg(center.z)
						.arg(radius)
						.arg(rms));

		ccLog::Print(tr("[Fit circle] Normal (%1,%2,%3)")
			.arg(normal.x)
			.arg(normal.y)
			.arg(normal.z));

		// create the circle representation as a polyline
		ccPolyline* circle = ccPolyline::Circle(CCVector3(0, 0, 0), radius, 128);
		if (circle)
		{
			circle->setName(QObject::tr("Circle r=%1").arg(radius));
			cloud->addChild(circle);
			circle->prepareDisplayForRefresh();
			circle->copyGlobalShiftAndScale(*cloud);
			circle->setMetaData("RMS", rms);

			ccGLMatrix trans = ccGLMatrix::FromToRotation(CCVector3(0, 0, 1), normal);
			trans.setTranslation(center);
			circle->applyGLTransformation_recursive(&trans);


			addToDB(circle, false, false, false);
		}
	}

	refreshAll();
}

5.相关代码

  • PCL RANSAC拟合空间圆
  • PCL RANSAC分割提取多个空间圆
  • Open3D——RANSAC拟合空间圆
  • Open3D 进阶(20)附有限制条件的间接平差拟合空间圆

你可能感兴趣的:(CloudCompare,计算机视觉,算法,c++,开发语言,3d)