海康VisionMaster(Group+齿轮测量+脚本输出)方案

本文介绍了一个基于图像处理的技术流程,用于测量齿轮中心到顶点的距离,包括图像输入、特征检测(如快速匹配、位置修正和圆查找)、点圆测量、数据收集和分析,最终通过脚本输出距离数据和统计信息。

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

直接上需求:需测量出齿轮中心到顶点的距离并输出数据

大致案例项目流程及输入输出:

现在进入主题:如何进行实现。

模块输入输出步骤:(可直接看模块序号即可知道步骤)

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

### VisionMaster Group 模块使用说明 #### 配置Group显示设置 在VisionMaster环境中,可以配置Group的显示设置来优化图像处理和查看效果。通过调整这些参数,能够更好地满足特定应用场景的需求[^3]。 ```cpp // 设置组显示属性示例代码 void configureGroupDisplay(Group& group, bool showBoundingBoxes, int lineWidth) { group.setShowBoundingBoxes(showBoundingBoxes); group.setLineWidth(lineWidth); } ``` #### 订阅输出图像模块 为了实时监控或进一步分析处理后的图像数据,在VisionMaster中可以通过订阅输出图像模块实现这一功能。这允许开发者获取经过各种算法运算之后的结果图片流,并对其进行后续操作。 ```cpp // 订阅并接收图像帧的例子 ImageFrame subscribeToOutput(const std::string& groupName) { ImageModule outputModule = getOutputModule(groupName); // 获取指定名称下的输出模块实例 return outputModule.subscribe(); // 开始监听来自该模块的新帧事件 } ``` #### 图像数据获取方式 根据官方文档指导,遵循2.4.1章节描述的方法可以从已定义好的流程里抓取到实际使用的图像资源。这里需要注意区分不同类型的像素格式所代表的具体含义: - **MONO8 (17301505)**:表示单通道8位灰度图像; - **RGB24 (35127316)** :指三通道每种颜色占用8比特空间构成的一个完整的彩色图像; 当调用相应API读取图像时,请确保正确解析其对应的色彩模式以便于后续应用开发工作顺利开展。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值