目录
- 1.概述
- 2.软件实现
- 3.完整操作
- 4.算法源码
- 5.相关代码
本文由CSDN点云侠原创,CloudCompare——点云空间圆拟合,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。
1.概述
CloudCompare软件中的'Tools——>Fit——>Circle
功能可以实现点云的空间圆拟合。
2.软件实现
1. 首先选中点云
2. 拟合功能
3. 拟合结果
白色的线为拟合出来的空间圆模型
4. 拟合参数
5. 修改拟合圆的颜色
选中拟合的空间圆模型使用Edit
中的Colors
功能即可对拟合结果进行颜色修改。
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)附有限制条件的间接平差拟合空间圆