VisionPro二次开发学习笔记11-使用 Caliper和Fixture定位Blob工具检测方块

news2024/11/13 13:00:50

该示例演示了如何使用卡尺工具和夹具工具来固定 Blob 工具。示例代码将检测图像上部区域中小方块的存在。当点击“运行”按钮时,将读取一张新图像。卡尺工具将被运行,卡尺工具的输出 Y 信息将传递给夹具工具。夹具工具使用来自卡尺工具的 Y 信息和新图像,并创建一个新的输出图像。夹具工具的输出图像随后将传递给 Blob 工具.

警告 :
该应用程序仅在图像仅在 Y 方向上变化时才能正常工作。这是因为卡尺工具仅测量图像的上边缘,因此只能准确检测 Y 方向的变化。

这三个工具是在此应用程序之外创建的,并在初始化(Form_Load)期间加载。可以使用 QuickStart 检查各个工具的设计,它们位于上一级目录中。

1. 创建vpp文件

  1. 打开VisionPro QuickBuild,新建CogJob1,打开ImageSouce,选择文件C:\Program Files\Cognex\VisionPro\Images\square_images.idb作为输入图像源

在这里插入图片描述

  1. 依次添加CogCaliperTool,CogFixtureTool,CogBlobTool工具,并连线

在这里插入图片描述

  1. 卡尺工具的搜索区域设置为包含小白方块的矩形的上边缘。该工具设置为一个边缘,并从浅到深进行查找,该应用程序仅在图像仅在 Y 方向上变化时才能正常工作。这是因为卡尺工具仅测量图像的上边缘,因此只能准确检测 Y 方向的变化,需要设置旋转90度

在这里插入图片描述
在这里插入图片描述

  1. 夹具工具从 Caliper 获取位置信息,并从图像文件工具获取图像,创建一个新图像,然后传递给 Blob 工具。夹具工具的新图像已针对新位置进行了校正

在这里插入图片描述

  1. Blob 工具设置为最小 10 像素。阈值设置为硬动态,适用于浅色背景上的深色 Blob
    在这里插入图片描述

  2. 运行工具后,小方块的存在被检测

在这里插入图片描述

  1. 确认无误后,分别保存CogCaliper,CogFixture,CogBlob工具的vpp到本地供后续程序开发使用

在这里插入图片描述

2. 添加引用

using Cognex.VisionPro.Blob;
using Cognex.VisionPro.CalibFix;
using Cognex.VisionPro.Caliper;
using Cognex.VisionPro.ImageFile;

3. 界面设计

添加CogDisplay控件和Button按钮.

在这里插入图片描述

4. 声明变量

        private CogImageFileTool fileTool;
        private CogCaliperTool caliperTool;
        private CogFixtureTool fixtureTool;
        private CogBlobTool blobTool;

5. 加载工具

        private void InitializeCogTool()
        {
            string ImageFileName = @"Images\square_images.idb";
            string strBaseDir = Environment.GetEnvironmentVariable("VPRO_ROOT");

            if (string.IsNullOrEmpty(strBaseDir))
            {
                throw new Exception("环境变量VPRO_ROOT未设置.");
            }

            fileTool = new CogImageFileTool();
            fileTool.Operator.Open(Path.Combine(strBaseDir, ImageFileName), CogImageFileModeConstants.Read);

            string VPPFiles = "G:/VisonProStudy/UsingQB/vpp2/";
            caliperTool = (CogCaliperTool)CogSerializer.LoadObjectFromFile(VPPFiles + "caliper_tool.vpp");
            fixtureTool = (CogFixtureTool)CogSerializer.LoadObjectFromFile(VPPFiles + "fixture_tool.vpp");
            blobTool = (CogBlobTool)CogSerializer.LoadObjectFromFile(VPPFiles + "blob_tool.vpp");

        }
        private void DisplayErrorAndExit(string ErrorMsg)
        {
            MessageBox.Show(ErrorMsg + "\nPress OK to exit.");
            Application.Exit();
        }

        private void Form12_Load(object sender, EventArgs e)
        {
            try
            {
                InitializeCogTool();
            }
            catch (CogException ex)
            {
                DisplayErrorAndExit("Tool Load Error:" + ex.Message);
            }
            catch (Exception ex)
            {
                DisplayErrorAndExit("Tool Load Error:" + ex.Message);
            }

        }

6. 处理按钮点击事件

private void button1_Click(object sender, EventArgs e)
        {
            CogTransform2DLinear linXform;
            CogImage8Grey tempImage;

            try
            {
                // 第一步)清除静态图形
                cogDisplay1.StaticGraphics.Clear();

                // 第二步)从图像数据库文件获取一张图像
                imageFileTool.Run();
                tempImage = (CogImage8Grey)imageFileTool.OutputImage;
                cogDisplay1.Image = tempImage;

                // 第三步)运行卡尺工具并检查其结果,绘制结果图形
                caliperTool.InputImage = tempImage;
                caliperTool.Run();
                if (caliperTool.RunStatus.Result != CogToolResultConstants.Accept)
                {
                    throw caliperTool.RunStatus.Exception;
                }

                if (caliperTool.Results.Count == 0)
                {
                    throw new Exception("未找到边缘.");
                }
                cogDisplay1.StaticGraphics.Add(caliperTool.Results[0].CreateResultGraphics(CogCaliperResultGraphicConstants.All), "");

                // 第四步)运行夹具工具并检查其结果
                fixtureTool.InputImage = tempImage;
                fixtureTool.Run();
                if (fixtureTool.RunStatus.Result != CogToolResultConstants.Accept)
                {
                    throw fixtureTool.RunStatus.Exception;
                }

                // 仅设置 Y(不设置 X、缩放或倾斜)
                linXform = (CogTransform2DLinear)fixtureTool.RunParams.UnfixturedFromFixturedTransform;
                linXform.TranslationY = caliperTool.Results[0].Edge0.PositionY;
                fixtureTool.Run();
                if (fixtureTool.RunStatus.Result != CogToolResultConstants.Accept)
                {
                    throw fixtureTool.RunStatus.Exception;
                }

                // 第五步)运行 Blob 工具并检查其结果,绘制结果图形
                blobTool.InputImage = (CogImage8Grey)fixtureTool.OutputImage;
                blobTool.Run();
                if (blobTool.RunStatus.Result != CogToolResultConstants.Accept)
                {
                    throw blobTool.RunStatus.Exception;
                }

                if (blobTool.Results.GetBlobs().Count == 0)
                {
                    throw new Exception("未找到 blob 结果.");
                }
                cogDisplay1.StaticGraphics.Add(blobTool.Results.GetBlobs()[0].CreateResultGraphics(
                    CogBlobResultGraphicConstants.Boundary | CogBlobResultGraphicConstants.CenterOfMass), "");
            }
            catch (CogException ex)
            {
                DisplayErrorAndExit("工具运行错误: " + ex.Message);
            }
            catch (Exception gex)
            {
                DisplayErrorAndExit("工具运行错误: " + gex.Message);
            }
        }

7. 界面效果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1995505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新手养猫怎么选智能猫砂盆?不踩雷平价实用攻略测评分享!

众所周知,猫咪是非常爱干净的动物,一旦猫砂盆满了,它们就可能会选择其他角落“解决”,这不仅会让家里充满异味,还可能影响猫咪的健康。而长期堆积的猫砂,也容易滋生细菌,对猫咪的爪子也是一种伤…

[CISCN2019 华东南赛区]Web111

打开题目,看到题目 注意最下面的Build With Smarty! , 猜测是smarty模板注入。smart是php的模板引擎,模板引擎的作用就是分离前端页面和数据的,题目中显示API的URL由于环境的原因无法使用,但我们的IP依旧显示在了页面的右上角&…

python-约瑟夫环(赛氪OJ)

[题目描述] n 个人( 0,1,2,3,4...n−1 ),围成一圈,从编号为 k 的人开始报数,报数报到 m 的人出队。 下次从出队的人之后开始重新报数,循环往复,当队伍中只剩最后一个人的时候,那个人…

【Material-UI】Checkbox 组件中的 Label Placement 设置详解

文章目录 一、Checkbox 组件简介1. 组件概述2. labelPlacement 属性 二、labelPlacement 属性的使用方法三、各标签位置的效果与应用场景1. Top(顶部)2. Start(左侧)3. Bottom(底部)4. End(右侧…

【文献精读】LOCA 图4

(1)数据流动 QKV的选取

Compass Arena 上新啦!新增双多模态模型匿名对战

2024 年 5 月,上海人工智能实验室司南 OpenCompass 团队 与魔搭 ModelScope 联合推出了大模型评测平台——Compass Arena(大模型竞技场),为国内的大语言模型领域引入了一种全新的竞技模式。 今天,Compass Arena 迎来重…

JVM知识总结(G1收集器)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ G1收集器 G1**(Garbage First)是一款面向服…

Mocaverse「Enter MOCALAND」上线!

我们很高兴宣布 Mocaverse 和 The Sandbox 将开展一项新合作——「Enter MOCALAND!」 继 “Into the Unknow” Game Jam 成功举办之后,我们的创作者们在此基础上创作出了近 50 款未来派多人游戏,我们很高兴能继续与社区一起庆祝共同创作&…

Redis与DataBase保持数据一致性

文章目录 1. 读取数据2. 写数据2.1 先操作缓存2.2 先操作数据库 在我们系统中缓存最常用的策略是:服务端需要同时维系DB和Cache,并且是以DB的结果为准, Cache-Aside Pattern(缓存分离模式、旁路缓存)。 1. 读取数据 当…

高质量翻译对中国移动应用在国外市场推广的影响

在移动应用的竞争格局中,打入国外市场对中国开发商来说既是机遇也是挑战。决定中国移动应用程序在海外成功的最关键因素之一是其翻译质量。高质量的翻译在有效推广该应用程序、确保其与当地用户产生共鸣,并最终推动新市场的采用和增长方面发挥着关键作用…

嵌入式全栈开发学习笔记---数据结构(广度优先算法)

目录 过程分析 代码实现 queue_maze.c 上节我们讲完了队列,本节开始学习广度优先算法! 之前我们用深度优先算法找出从迷宫出来的所有路径,本次我们要用广度优先算法找出最短路径。 过程分析 广度优先算法也叫广度优先搜索。 这种算法就相当…

Qwen2-Math 开源 AI 模型发布;阿里云推出首个域名 AI 大模型应用丨 RTE 开发者日报

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思…

vscode用快捷键一键生成vue模板

项目中有些代码模块是固定的,如下面的代码所示,为了不重复写这些相同的代码,我们可以使用快键键一键生成模板。 流程: 中文:首选项-> 用户代码片段 -> 输入框中输入vue,找到vue.json文件(没有vue.j…

如意AI健康管理开放域自然对话算法分析报告

一、算法全周期行为分析 1. 算法安全 信息内容安全:通过意图识别和实体抽取技术,确保生成的内容不涉及违法或不当信息。 信息源安全:数据采集环节采用安全措施,保护数据不被非法访问。 2. 算法监测 信息安全监测:实施实…

国产芯上运行TinyMaxi轻量级的神经网络推理库-米尔基于芯驰D9国产商显板

本篇测评由优秀测评者“短笛君”提供。 本文将介绍基于米尔电子MYD-YD9360商显板(米尔基于芯驰D9360国产开发板)的TinyMaxi轻量级的神经网络推理库方案测试。 算力测试 TinyMaix 是面向单片机的超轻量级的神经网络推理库,即 TinyML 推理库&a…

重头开始嵌入式第十六天(结构体,共用体)

目录 结构体 结构体定义 结构体初始化 结构体赋值 结构体调用 结构体大小 在 C 语言中,结构体内存对齐规则主要遵循以下原则: 共用体 共用体定义 共同体赋值,初始化 共用体大小 结构体与共用体的区别 结构体 在 C 语言中,…

vuex properties of undefined (reading ‘getters‘)

前言: 最近打算用vue 写个音乐播放器,在搞 vuex 的时候遇到一个很神奇报错;vuex 姿势练了千百次了,刚开始的时候我一直以为是代码问题,反复检查了带了,依旧报错。 Error in mounted hook: "TypeError:…

PHP全方位多功能投票小程序系统源码

🌟【全民参与,决策更精彩】全方位多功能投票小程序大揭秘!🎉 🚀 开篇引入:投票新风尚,尽在指尖 Hey小伙伴们,你是否厌倦了传统的投票方式,觉得它们既繁琐又不够灵活&am…

历代文学-技术生态-总体介绍

1. 历代文学简介 历代文学(https://literature.sinhy.com/#/literature?__c1000,微信小程序可直接搜索“历代文学”)是一个由两个人(一个后端和一个前端)开发的文学网站,是一个收录从古到今、以及古今中外…

C++之运算符重载系列深入学习:从入门到精通!

为什么需要对运算符进行重载 C预定义中的运算符的操作对象只局限于基本的内置数据类型,但是对于我们自定义的类型是没有办法操作的。但是大多时候我们需要对我们定义的类型进行类似的运算,这个时候就需要我们对这么运算符进行重新定义,赋予其…