RANSAC 算法拟合平面

本文介绍了RANSAC算法拟合平面,使用的视觉库为VisionPro。详细说明了输入参数,如Distance Threshold用于区分离群值,Assurance可平衡执行时间和拟合精度,Worst Case Proportion Outliers指定离群点最坏情况比例,还提及算法需区分内部和离群变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;

希望以上对你有所启发

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值