圆查找模块用于查找图像中指定区域内符合特定要求的圆,并输出圆相关数据,如圆是否存在、圆中心点坐标、圆半径、拟合误差等。
本节包含如下内容:
该模块的算法运行主要包含以下3个步骤:
在圆环形的ROI内自动设置卡尺区域。如下图1和图2中蓝色线条围合的环形区域即ROI,黄色矩形即卡尺区域。
卡尺的具体工作原理,请参见卡尺工具工作原理。
在卡尺区域内提取目标的边缘点。如下图2和图3中紫色X形所示的点。
将提取到的边缘点集拟合为圆,即下图4中所示的绿色圆。
ROI内设置卡尺区域 |
在卡尺区域内提取边缘点 |
---|---|
![]() |
![]() |
提取到的边缘点集 |
基于边缘点集进行圆拟合 |
---|---|
![]() |
![]() |
在流程中,圆查找模块的:
在流程中调用圆查找模块后,该模块的主要配置步骤如下:
执行一次流程,使图像源将图像数据输出至圆查找。
在基本参数页签,选择ROI类型,并在图像上圆所在区域绘制ROI。
根据业务需求指定下文参数配置中提及的卡尺数量、扇环半径、滤波尺寸等运行参数。
以下动图以绘制圆形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。仅边缘梯度阈值大于该值的边缘点能被算法检测到。数值越大,抗噪能力越强,得到的边缘数量越少,甚至可能导致目标边缘点被筛除
边缘梯度是衡量卡尺区域内图像源的灰度变化率的指标。
指滤波器大小。可用于增强边缘并抑制噪声,最小取值为1。当边缘模糊或有噪声干扰时,增大该值可使检测结果更加稳定。但如果边缘与边缘之间距离小于滤波尺寸时,反而会影响边缘位置的精度甚至丢失边缘
边缘过渡带较小时建议使用较小滤波尺寸,边缘过渡带较大时使用较大滤波尺寸
用于扫描边缘点的ROI(即上文模块原理中提及的卡尺)的数量。当该数量设置为10和100时,相同弧度范围内的卡尺分布见下图
卡尺数量10 |
卡尺数量100 |
---|---|
![]() |
![]() |
误差过大而被排除不参与拟合的最小点数量。一般情况下,离群点越多,该值应设置越大。为获取更佳查找效果,建议与下文的剔除距离结合使用。
如下左图中红色点为剔除的边缘点。
当剔除点数设置过大时,可能会导致拟合失败,无法查找到圆(见如下右图)。
剔除点示意 |
剔除点数过大 |
---|---|
![]() |
![]() |
开启初定位后,需配置下文提及的圆定位敏感度和下采样系数。初定位可大致判定ROI区域内更接近圆的区域中心作为初始圆中心,便于后续精细圆查找。
若关闭初定位,则默认ROI中心为初始圆中心。如果圆查找模块在流程中的前一模块为位置修正,建议关闭初定位。
下采样也叫降采样,即是采样点数减少。如果其降采样系数为k,则表示在原图中每行每列每隔k个点取一个点组成一幅图像。因此下采样系数越大,轮廓点越稀疏,轮廓越不精细,该值不宜设置过大。
排除干扰点。该参数取值越大,排除噪声干扰的能力越强,但也越容易导致圆的初定位失败。
允许离群点到拟合圆的最大像素距离,值越小,排除点越多。
在环形ROI中分布的若干个卡尺的宽度。在一定范围内增大该值可以获取更加稳定的边缘点,具体可参见直线查找。
设置圆的拟合方式,包括最小二乘、huber和tukey三种。三种拟合方式仅在权重的计算方式上有所差异。随着离群点数量增多以及离群距离增大,可逐次使用最小二乘、huber和tukey。
该模块输出结果中各项参数详情,请参见圆查找模块的输出结果。