圆查找

圆查找模块用于查找图像中指定区域内符合特定要求的圆,并输出圆相关数据,如圆是否存在、圆中心点坐标、圆半径、拟合误差等。

本节包含如下内容:

模块原理

该模块的算法运行主要包含以下3个步骤:

  1. 在圆环形的ROI内自动设置卡尺区域。如下图1和图2中蓝色线条围合的环形区域即ROI,黄色矩形即卡尺区域。

    说明:

    卡尺的具体工作原理,请参见卡尺工具工作原理

  2. 在卡尺区域内提取目标的边缘点。如下图2和图3中紫色X形所示的点。

  3. 将提取到的边缘点集拟合为圆,即下图4中所示的绿色圆。

ROI内设置卡尺区域

在卡尺区域内提取边缘点

提取到的边缘点集

基于边缘点集进行圆拟合

使用限制

单个圆查找模块只能查找一个圆。如果要查找多个圆,建议配合Group模块的循环功能使用。如果需查找的多个圆有规律排列,可调用阵列圆查找 模块。

使用方法

在流程中,圆查找模块的:

  • 前序模块通常为图像源图像源圆查找提供图像输入。

  • 后序模块可为逻辑工具模块(如脚本数据集合);也可为其他模块,如图形生成模块中的圆拟合和测量模块中的点点测量圆查找为后序模块提供定位到的圆信息。

在流程中调用圆查找模块后,该模块的主要配置步骤如下:

  1. 执行一次流程,使图像源将图像数据输出至圆查找

  2. 基本参数页签,选择ROI类型,并在图像上圆所在区域绘制ROI。

  3. 根据业务需求指定下文参数配置中提及的卡尺数量扇环半径滤波尺寸等运行参数。

以下动图以绘制圆形ROI为例。

图 1 绘制ROI

使用示例

以下视频展示了测量同心度的应用示例。具体为:在流程中组合调用圆查找脚本数据集合圆拟合点点测量等其他模块,测量汽车刹车盘上的10个小圆孔的同心度。

该应用示例中,脚本模块的脚本代码如下。其中所调用的脚本接口详情,请参见脚本接口

using System;
using System.Text;
using System.Windows.Forms;
using Script.Methods;
/************************************
Shell Module default code: using .NET Framwwork 4.6.1
*************************************/
public partial class UserScript:ScriptMethods,IProcessMethods
{
    //the count of process
	//执行次数计数
    int processCount ;  

    /// <summary>
    /// Initialize the field's value when compiling
	/// 预编译时变量初始化
    /// </summary>
    public void Init()
    {
        //You can add other global fields here
		//变量初始化,其余变量可在该函数中添加
        processCount = 0;
       
    }

    /// <summary>
    /// Enter the process function when running code once
	/// 流程执行一次进入Process函数
    /// </summary>
    /// <returns></returns>
    public bool Process()
    {
        //You can add your codes here, for realizing your desired function
		//每次执行将进入该函数,此处添加所需的逻辑流程处理
		float[] x = new float[9];
		float[] y = new float[9];		
		for(int i=1;i<10;i++)
        {
			x[i-1] = (float)((x1-x0)*Math.Cos(36*i*Math.PI/180) - (y1-y0)*Math.Sin(36*i*Math.PI/180) + x0);
			y[i-1] = (float)((x1-x0)*Math.Sin(36*i*Math.PI/180) + (y1-y0)*Math.Cos(36*i*Math.PI/180) + y0);
        }		
		SetFloatArrayValue("x2",x,0,9);
		SetFloatArrayValue("y2",y,0,9);		
        return true;
    }
}

参数配置

以下仅介绍该模块的运行参数详情。通过配置运行参数,可定义当前模块如何处理输入的数据。

说明:
扇环半径

ROI扇环区域半径,建议内、外径与实际查找圆半径接近,可提高查找精度。

边缘类型
设置待查找的边缘类型。
最强

只提取扫描范围内梯度最大的边缘点集合并拟合成圆。

最后一条

只提取扫描范围内与圆心距离最大的边缘点集合并拟合成圆。

第一条

只提取扫描范围内与圆心距离最小的边缘点集合并拟合成圆

最强边缘

最后一条

第一条边缘

边缘极性
黑到白

仅检测边缘极性为“黑到白”的边缘。从圆心向外看,灰度值低的区域过渡到灰度值高的区域的边缘,极性为黑到白。

白到黑

仅检测边缘极性为“白到黑”的边缘。从圆心向外看,灰度值高的区域过渡到灰度值低的区域的边缘,极性为白到黑。

任意

上述两种边缘均被检测。

黑到白

白到黑

边缘阈值

边缘阈值即梯度阈值,取值范围为0~255。仅边缘梯度阈值大于该值的边缘点能被算法检测到。数值越大,抗噪能力越强,得到的边缘数量越少,甚至可能导致目标边缘点被筛除

说明:

边缘梯度是衡量卡尺区域内图像源的灰度变化率的指标。

图 2 边缘阈值原理
滤波尺寸

指滤波器大小。可用于增强边缘并抑制噪声,最小取值为1。当边缘模糊或有噪声干扰时,增大该值可使检测结果更加稳定。但如果边缘与边缘之间距离小于滤波尺寸时,反而会影响边缘位置的精度甚至丢失边缘

边缘过渡带较小时建议使用较小滤波尺寸,边缘过渡带较大时使用较大滤波尺寸

卡尺数量

用于扫描边缘点的ROI(即上文模块原理中提及的卡尺)的数量。当该数量设置为10和100时,相同弧度范围内的卡尺分布见下图

卡尺数量10

卡尺数量100

剔除点数

误差过大而被排除不参与拟合的最小点数量。一般情况下,离群点越多,该值应设置越大。为获取更佳查找效果,建议与下文的剔除距离结合使用。

如下左图中红色点为剔除的边缘点。

当剔除点数设置过大时,可能会导致拟合失败,无法查找到圆(见如下右图)。

剔除点示意

剔除点数过大

初定位

开启初定位后,需配置下文提及的圆定位敏感度下采样系数初定位可大致判定ROI区域内更接近圆的区域中心作为初始圆中心,便于后续精细圆查找。

若关闭初定位,则默认ROI中心为初始圆中心。如果圆查找模块在流程中的前一模块为位置修正,建议关闭初定位。

下采样参数

下采样也叫降采样,即是采样点数减少。如果其降采样系数为k,则表示在原图中每行每列每隔k个点取一个点组成一幅图像。因此下采样系数越大,轮廓点越稀疏,轮廓越不精细,该值不宜设置过大。

图 3 下采样
圆定位敏感度

排除干扰点。该参数取值越大,排除噪声干扰的能力越强,但也越容易导致圆的初定位失败。

剔除距离

允许离群点到拟合圆的最大像素距离,值越小,排除点越多。

投影宽度

在环形ROI中分布的若干个卡尺的宽度。在一定范围内增大该值可以获取更加稳定的边缘点,具体可参见直线查找

初始拟合
设置圆的初始拟合模式。
局部

按照局部的特征点拟合圆。穷举遍历边缘点集中的部分点来圆拟合,并将最优圆作为初始拟合圆,如果局部特征更加准确反映圆所在位置,则采用局部最优,否则采用全局最优。

图 4 局部拟合
全局

按照查找到的全局特征点进行圆拟合。全局最优特征更加准确反映圆所在位置时采用该模式。

图 5 全局拟合
拟合方式

设置圆的拟合方式,包括最小二乘hubertukey三种。三种拟合方式仅在权重的计算方式上有所差异。随着离群点数量增多以及离群距离增大,可逐次使用最小二乘hubertukey

模块结果

该模块输出结果中各项参数详情,请参见圆查找模块的输出结果