RANSAC 算法拟合平面
视觉库为VisionPro
1、输入参数
Distance Threshold:对于拟合算法的每次迭代,测量候选平面与每个3D输入点之间的距离。比这个阈值更远的点被认为是离群值。 默认为1
Assurance:这个值必须大于0,并且小于或等于1。
使用这个来平衡工具的执行时间和拟合平面的精度。减少这个值可以降低执行时间,但会使拟合平面不那么准确。建议设置一个超时时间。
算法必须区分内部变量和离群变量,内部变量的分布可以用一组模型参数来解释,而离群变量则不适合模型。给定一组inliers,该算法可以估计出最适合该数据的几何形状。下图显示了给定数据集的一组inliers和离群值:
Worst Case Proportion Outliers:指定平面拟合的3D点所期望的离群点的最坏情况比例。值0.7表示处理的3D点中有70%是离群值,默认设置为0将强制该工具使用所有点拟合
Cog3DPlane plane=null;
double RMS=0;
double NumInliers=0;
double NumOutliers=0;
CogImage16Range inputImage=new CogImage16Range()//附一张Range图片
ICogRegion region=CogIPOneImageTool.Region as CogRectangle;//传个区域么
double assurance = 0.5;
double distanceThreshold = 1;
double worstCaseProportionOutliers = 0;
Cog3DRobustFitTechniqueConstants robustFitTechnique = Cog3DRobustFitTechniqueConstants.AdaptiveRANSAC ;
Cog3DVect2Collection srcPoints2D = new Cog3DVect2Collection();
//获取变换到像素空间的 变换矩阵
CogTransform2DLinear pixelFromRegionSelectedSpaceXform =inputImage.GetTransform("#", region.SelectedSpaceName) as CogTransform2DLinear;
//将区域映射到像素空间
ICogRegion regionPixel = region.Map(pixelFromRegionSelectedSpaceXform ,CogCopyShapeConstants.All) as ICogRegion;
//创建一个图像缓冲区,
CogRLEBuffer regionRle = regionPixel.CreateRLE(255, 0);
//左顶点坐标
int ulX = regionRle.X;
int ulY = regionRle.Y;
//获取一维数组,从第一行第一个像素开始到最后一列,接着从第二行第一个开始,直到结束,每一行的末尾由一个长 //度值为零的标识 计数单位为255 最大255
//例如 计数了255 个算1个完整的单位runs的长度加1 ,如果计数255一行没有结束,从1开始计如果计到行的最后一 //个结束计,runs的长度加1,最后一个在给runs长度加1,并且CogRLERun.length=0,value=0,后面的行以同样的方 //式计
//
CogRLERun[] runs = regionRle.GetRuns();
int x = ulX;
int y = ulY;
//获取像素点的坐标
foreach (CogRLERun run in runs)
{
if (run.Length > 0)
{
if (run.Value > 0)
{
for (int i = 0; i < run.Length; i++)
srcPoints2D.Add(new Cog3DVect2(x++, y));
}
else
{
x += run.Length;
}
}
else
{
x = ulX;
y++;
}
}
Cog3DVect3Collection dstPoints3D;
bool[] visible;
//将2D图像空间点转换为3D点的集合(在Sensor3D空间中)
inputImage.MapPoints3DFrom2D("Sensor3D", "#", srcPoints2D, out visible, out dstPoints3D);
//去除丢失点
Cog3DVect3Collection pointsPhys3D = new Cog3DVect3Collection();
for (int i = 0; i < visible.Length; i++)
{
if (visible[i] == true)
pointsPhys3D.Add(dstPoints3D[i]);
}
//拟合3D平面
Cog3DPlaneFitterUsing3DPoints planeFitter =
new Cog3DPlaneFitterUsing3DPoints();
planeFitter.RobustFitParameters.Assurance = assurance;
planeFitter.RobustFitParameters.DistanceThreshold = distanceThreshold;
planeFitter.RobustFitParameters.WorstCaseProportionOutliers = worstCaseProportionOutliers;
planeFitter.RobustFitParameters.RobustFitTechnique = robustFitTechnique;
Cog3DPlaneFitterUsing3DPointsResult results =
planeFitter.Execute(pointsPhys3D);
Cog3DPlane plane = results.GetPlanePhys3D();
RMS=results.ResidualsPhys3D.Rms;;
NumInliers=results.GetInlierIndices().Count;
NumOutliers=results.GetOutlierIndices().Count;
希望以上对你有所启发