icp配准算法代码
vtkNew<vtkPolyData> source;
vtkNew<vtkPolyData> target;
vtkNew<vtkPolyData> temp;
temp->SetPoints(linePoints);
vtkNew<vtkPolyData> temp1;
temp1->SetPoints(featurePoints);
vtkNew<vtkVertexGlyphFilter> vertexFilter;
vertexFilter->SetInputData(temp);
vertexFilter->Update();
source->ShallowCopy(vertexFilter->GetOutput());
vtkNew<vtkVertexGlyphFilter> vertexFilter1;
vertexFilter1->SetInputData(temp1);
vertexFilter1->Update();
target->ShallowCopy(vertexFilter1->GetOutput());
icpTransform->SetSource(source);
icpTransform->SetTarget(target);
icpTransform->GetLandmarkTransform()->SetModeToRigidBody();
icpTransform->SetMaximumNumberOfIterations(20);
icpTransform->StartByMatchingCentroidsOn();//这一部分非常重要
icpTransform->Modified();
icpTransform->Update();
icp_ok = 1;
配准不成功的原因
icpTransform->StartByMatchingCentroidsOn()
是设置 Iterative Closest Point (ICP) 配准算法的一个选项,用于初始化配准的第一步。具体来说,它执行以下操作:
-
匹配质心:在启用这个选项后,ICP 算法会首先计算源点云和目标点云的质心(中心点)。
-
将源点云平移到目标点云的质心:ICP 算法会通过将源点云平移到目标点云的质心来对齐它们。这有助于初始对齐,从而更容易找到最佳的点云匹配。
在点云配准中,初始对齐通常是一个关键的步骤。如果点云之间存在较大的旋转或平移,ICP 算法可能会陷入局部最小值,导致配准失败。通过将点云的质心对齐,可以大大提高找到良好初始对齐的机会,这有助于 ICP 算法更快地收敛到全局最佳解。
请注意,启用此选项可能会降低算法的收敛速度,因为在开始时需要额外的计算来匹配质心。但这通常会提高配准的准确性,尤其是当初始对齐很差时。
因此,通过启用 icpTransform->StartByMatchingCentroidsOn()
,你实际上提高了初始对齐的质量,从而可能使点云配准更准确。