废话不多说,直接上需求:需测量出齿轮中心到顶点的距离并输出数据(自己加了个圆拟合)。
大致案例项目流程及输入输出:
现在进入主题:如何进行实现。
模块输入输出步骤:(可直接看模块序号即可知道步骤)
1.输入‘图像源’
2.‘快速匹配’:对齿轮顶点部位进行匹配(可调节ROI区域以防检测到其他多余的部分),并调整相关参数以检测到所有齿轮
3.‘位置修正’
4.‘圆查找’:进行位置修正以方便‘圆查找’进行匹配(防止因产品位置变动而找不到圆,此处利用找齿轮边缘的修正信息可能依
旧造成误差,可新建‘快速匹配’只匹配圆,并进行‘位置修正’,再结合‘圆查找’来获取圆更精准的信息)
5.添加‘Group’:进入group循环模块之前设置(扳手图标)好“输入设置”和“循环设置”,输入图像、匹配框、输出圆环的信息,循环结束值为匹配到的个数
6.进入‘Group’模块,添加位置修正:位置补正选按坐标,原点X、原点Y、角度分别链接上输入其中的‘快速匹配’模块的匹配框中心X,匹配框中心Y,角度。(模块设置内执行只会执行一次,运行流程按钮将会进行循环并显示所有修正点,后续一样)
!!!注意:此处一定要在后面的中括号中链接上循环索引(此步骤至关重要)
7.‘顶点检测’:绘制一个矩形框选中一个齿轮顶点部位,并选中位置修正并执行以获取所有的顶点
8.‘点圆测量’:输入获取到的顶点,并将外部输入的圆的信息依次输入并执行,以获取所有点到圆心的距离
9.将获取的顶点信息用点集进行收集,并输出‘Group’模块便于进行‘圆拟合’(不使用点集直接输出的顶点信息不能进行圆拟合)
10.‘图形收集’:将需要显示的信息进行收集,并输出‘Group’模块便于(在流程中)进行显示
11.‘数据集合’:将获取到的所有的圆心到顶点的距离信息进行收集,并输出‘Group’模块便于脚本进行处理
12.离开‘Group’模块,进入group循环模块设置(扳手图标):配置好“输出信息”和“显示设置”,输出获取的顶点的点集、获取的圆心到顶点的数据集合。显示中输出图像收集的点、直线和文本
13.‘圆拟合’:(此处为自行增加的),输入点集的数据进行拟合圆
14.‘脚本’编写:设置输入 float 类型的数据集合和 int 类型的快速匹配的匹配个数,输出为所有距离、最大值、最小值、平均值和中位数。具体代码为图片内所显示(因截图限制,已压缩)
以下为完整代码,脚本内代码如下:
using System;
using System.Text;
using System.Windows.Forms;
using Script.Methods;
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
//每次执行将进入该函数,此处添加所需的逻辑流程处理
int a = in1;
float[] sun = new float[a];
GetFloatArrayValue("in0", ref sun, out a); //输入
//对数据进行数据处理输出
float max = sun[0]; //最大值
float min = sun[0]; //最小值
float sum = 0; //总和(计算平均值)
for (int i = 0; i < a; i++)//输出
{
SetFloatValueByIndex("out0", sun[i], i, a);
sum += sun[i]; //计算总和
if (sun[i] > max)
{
max = sun[i];
}
if (sun[i] < min)
{
min = sun[i];
}
}
float avg = sum / a; //计算平均值
SetFloatValue("average", avg); //设置平均值
// 计算并输出中位数
Array.Sort(sun);
float median;
if (a % 2 == 0)
median = (sun[a / 2 - 1] + sun[a / 2]) / 2;
else
median = sun[a / 2];
SetFloatValue("max", max);
SetFloatValue("min", min);
SetFloatValue("median", median);
return true;
}
}
15.‘格式化’需要输出的脚本信息
16.‘发送数据’给需要获取信息的设置(上述在通信管理中通过TCP客户端连接到了服务器,并当服务器发送Run时运行流程将数据发送出去)
17.可在流程1中配置(扳手图标)好需要输入/输出或显示设置的信息,当流程运行时将直观的看到流程中进行的操作
---end
附件内含有TCP通讯模块和方案原图及项目sol文件