引言
在计算机视觉、机器人导航、图像处理以及几何建模等众多应用场景中,准确地从二维点数据中拟合出几何形状是一项基础且关键的任务。作为常见的几何结构之一,圆形的拟合对于实际工程具有广泛的应用价值,例如,在检测圆形目标(如车轮、孔洞、标记)时,通过拟合得到圆心位置和半径信息,可以为后续的图像分析或控制决策提供重要参数。本文将介绍如何使用Techlego SDK智能接口实现一种拟合2D圆的方法以及针对一组给定的离散二维点数据来恢复理想圆参数的方法。
具体步骤
01
准备好拟合2D圆用的数据点,下图红色点即为所用数据点。
读取数据代码:

所用离散二维点数据(由于可视化需要输入三维点数据以及其法向量,实际只用到了每行的前两个数据):

数据点可视化显示:

02
进行2D圆粗拟合,其中代码中的变量x,y代表了圆的中心点,r代表了圆的半径。

03
根据粗拟合的结果再进行2D圆拟合,并打印拟合圆结果。

结果
01
程序输出结果

02
拟合圆可视化结果

总结
通过对二维圆形拟合问题的研究,可以看出即使是这样一个基础、经典的几何建模任务,在面对噪声、异常值和不均匀分布的点集时也面临着挑战。本文展示了利用Techlego SDK智能接口完成二维圆拟合的具体步骤,从实验结果来看,拟合出的圆能够很好地穿过大多数输入点,这证明了Techlego SDK智能接口在圆形拟合方面的可靠性和实用性。未来的工作可以进一步改进算法以更好地应对更复杂的数据情况,从而拓展其应用场景至更多相关领域。
源代码
#include "pch.h"
std::vector<techlego::pos2d> read_asc_file(const std::wstring& path)
{
std::ifstream ifs(path);
std::string line;
std::vector<techlego::pos2d>res;
while (std::getline(ifs, line))
{
if (line.empty())
{
continue;
}
float d0{};
float d1{};
float d2{};
float d3{};
float d4{};
float d5{};
sscanf_s(line.data(), "%f %f %f %f %f %f", &d0, &d1, &d2, &d3, &d4, &d5);
res.emplace_back(techlego::pos2d{ d0, d1 });
}
return res;
}
int main()
{
//测试数据路径
std::wstring data_path = L"D:\\soft_product1\\techlego_sdk\\C++\\examples\\拟合2d圆\\data.asc";
//读取测试数据
std::vector<techlego::pos2d> points = read_asc_file(data_path);
double x{}, y{}, r{};
//进行2D圆粗拟合
auto error = techlego::fit_circle_fast(points, x, y, r);
std::cout << "error:" << error << "\n";
std::cout << "x:" << x << "\n";
std::cout << "y:" << y << "\n";
std::cout << "r:" << r << "\n\n";
//根据粗拟合的结果再进行2D圆拟合
error = techlego::fit_cricle_fine(points, x, y, r);
std::cout << "error:" << error << "\n";
std::cout << "x:" << x << "\n";
std::cout << "y:" << y << "\n";
std::cout << "r:" << r << "\n";
return 0;
}
