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

news/2024/9/15 7:45:02/ 标签: 笔记, c#, 计算机视觉

该示例演示了如何使用卡尺工具和夹具工具来固定 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. 界面效果

在这里插入图片描述

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

8. 项目示例

整理了包含本文章的11个使用C#进行Cognex VisionPro二次开发学习笔记的示例源码,涵盖了从创建基于QuickBuild的应用程序到使用PMAlign和Caliper工具进行图像处理的多种实践案例,欢迎学习和指正
视觉领域 + 计算机视觉 + Cognex VisionPro + C#二次开发示例


http://www.ppmy.cn/news/1506808.html

相关文章

GeoServer+Postgis发布存储在Postgis中的栅格数据

这两天在研究GeoServer发布Postgis中存储的栅格数据,网上寻找的方法没有很哪个很顺利的成功了的(很多坑都踩了一遍),今天终于成功了,把发布过程记录一下,并分享给有需要的人。 前期准备 版本推荐&#xf…

onlyoffice使用Https访问

开发服务器用的是http,一切正常使用,部署到服务器后,由于服务器使用了Https,导致访问onlyoffice时控制台报错。Mixed Content: The page at http://xxxxx// was loaded over HTTPS, but requested an insecure frame http://xxxxx…

Java | Leetcode Java题解之第330题按要求补齐数组

题目&#xff1a; 题解&#xff1a; class Solution {public int minPatches(int[] nums, int n) {int patches 0;long x 1;int length nums.length, index 0;while (x < n) {if (index < length && nums[index] < x) {x nums[index];index;} else {x *…

【json解析】控制台打印json字符串格式正确,但json.loads()解析失败问题解决

问题为控制台打印json字符串格式正确&#xff0c;但json.loads()解析失败。看似简单的问题&#xff0c;却又折腾了好一会&#xff0c;因此记录一下解决方法&#xff01; 出现这个问题的原因&#xff1a;眼见不一定为实&#xff0c;控制台打印的json字符串并不一定是实际的json字…

Jar工具完全指南:从入门到精通

Jar工具完全指南&#xff1a;从入门到精通的详尽教程 前言 欢迎来到Jar工具的完全指南&#xff01;无论你是Java编程的初学者&#xff0c;还是经验丰富的开发者&#xff0c;掌握Jar工具都是必不可少的。Jar&#xff08;Java Archive&#xff09;是Java生态系统中的一个核心组…

Cocos通过Electron打包web应用后,在触屏一体机设备触摸滑动无效问题解决

Cocos通过Electron打包web应用后&#xff0c;在触屏一体机设备触摸滑动无效问题解决 已经很晚了&#xff0c;刚刚解决这个问题&#xff0c;还是想记录一下&#xff0c;因为刚刚接触 cocos 没多久&#xff0c;这个问题困扰了我很久。 背景 接手了一个答题小游戏&#xff0c;由于…

技术周总结 08.05-08.11周日

文章目录 一、08.06 周二1.1) 问题01 mac安装 scala:1. 使用 Homebrew2. 使用 SDKMAN!其他注意事项1. 确认 Scala 安装位置2. 设置 PATH 环境变量对于 zsh (macOS Catalina 及更高版本默认使用 zsh):对于 bash (如果您使用的是 bash shell): 3. 验证安装 二、08.09 周五2.1&…

WPF参考做的TextBox圆角,并且水印文字操作

1.首先进行 转换器操作&#xff08;获取当前Textbox Text是否为空或者空格&#xff09; / // <summary>/// 非空验证转换器/// </summary>#region String IsNullOrEmptypublic class IsNullOrEmptyConverter : IValueConverter{public object Convert(object valu…

【Linux基础】Linux基本指令(二)

目录 &#x1f680;前言一&#xff0c;mv指令二&#xff0c;more & less指令2.1 more 指令2.1 less指令 三&#xff0c;重定向技术(重要)3.1 echo指令3.2 输出重定向 >3.3 追加重定向 >>3.4 输入重定向 < 四&#xff0c;head & tail指令4.1 head 指令4.2 t…

excel中有些以文本格式存储的数值如何批量转换为数字

一、背景 1.1 文本格式存储的数值特点 在平时工作中有时候会从别地方导出来表格&#xff0c;表格中有些数值是以文本格式存储的&#xff08;特点&#xff1a;单元格的左上角有个绿色的小标&#xff09;。 1.2 文本格式存储的数值在排序时不符合预期 当我们需要进行排序的时候…

# 利刃出鞘_Tomcat 核心原理解析(三)

利刃出鞘_Tomcat 核心原理解析&#xff08;三&#xff09; 一、 Tomcat专题 - Tomcat架构 - 启动流程 1、Tomcat 启动流程 2、Tomcat 启动 步骤 : 1&#xff09; 启动tomcat &#xff0c; 需要调用 bin/startup.bat (在linux 目录下 , 需要调用 bin/startup.sh) &#xff0c…

【每日一题 | 组成原理】指令流水线

知识点与总结 指令流水线的本质是提高指令执行的并行性与效率&#xff0c;对比单周期处理器一起学习。掌握下图的并行逻辑理解基础上记忆此公式&#xff1a;T &#xff08;mn-1&#xff09;* t&#xff0c;其中m为流水段个数&#xff0c;n为指令条数&#xff0c;t为分割时间。…

微信小程序教程012:全局配置:tabBar

文章目录 2、tabBar2.1 什么是tabBar2.2 tabBar 的 6 个组成部分2.3 tabBar的节点配置项2.4 每个 tab 项的配置选项2、tabBar 2.1 什么是tabBar tabBar 是移动端应用常见的页面效果,用于实现多页面 的快速切换。小程序中通常将其分为: 底部 tabBar顶部 tabBar注意 tabBar中…

【Git】git 从入门到实战系列(三)—— 创建版本库

文章目录 一、前言二、创建仓库1、创建文件夹2、进入文件夹3、初始化 Git4、添加文件5、将文件添加到仓库6、提交更改7、查看提交记录 三、注意点四、总结 一、前言 版本库又名仓库&#xff08;Repository&#xff09;&#xff0c;可以简单理解成一个文件夹&#xff0c;这个文…

使用ubuntu串口数据收和发不一致问题

串口配置 使用virtual Serial Port Driver Pro模拟串口两个串口&#xff0c;com2和com3&#xff0c;使用默认配置&#xff1b;通过virtual box 串口映射功能&#xff0c;在Ubuntu里使用CuteCom打开com2接受和发送数据&#xff0c;在windows里使用com3发送和接收数据。 遇到问…

SpringCloud 微服务nacos和eureka

Spring是微服务架构&#xff0c;是一种经过良好架构设计的分布式架构方案。 微服务架构有如下特性 单一&#xff1a;微服务拆分粒度小&#xff0c;每一个服务都对应唯一的业务能力&#xff0c;做到单一职责&#xff0c;避免重复业务开发 面向服务&#xff1a;微服务对外暴漏…

学习大数据DAY32 HTML基础语法和Flask库的使用

目录 HTML 超文本标记语言 Hyper Text Markup Language 上机练习 9 Flask 显示层 UI 前后端结合动态加载列表数据 flask 在 html 中的语法 上机练习 10 HTML 超文本标记语言 Hyper Text Markup Language 1.<html></html>: 根标签 2.<head></head&…

[C#]基于C# winform结合llamasharp部署llama3中文的gguf模型

【llmasharp源码】 https://github.com/SciSharp/LLamaSharp 【测试模型】 https://www.modelscope.cn/pooka74/LLaMA3-8B-Chat-Chinese-GGUF.git 【测试通过环境】 vs2019 netframework4.7.2 llamasharp0.15.0 cuda11.7.1cudnn8.8.0 注意测试发现使用cpu推理非常卡&a…

el-input输入数字,带有千分位

封装组件 <template><el-inputchange"changenum"blur"blurInput"v-model"inputnum1"placeholder"请输入数字"clearable:disabled"disablednum":class" inputcolor ? input_num_dis : "></el-in…

[MRCTF2020]Ezpop

[MRCTF2020]Ezpop 题目是pop&#xff0c;考的其实就是pop链&#xff0c;可以自己先学学&#xff0c;啥也不会QAQ php反序列化之pop链_pop3.phpwelcome-CSDN博客 POP 面向属性编程(Property-Oriented Programing) 常用于上层语言构造特定调用链的方法&#xff0c;与二进制利用…