VisionPro二次开发学习笔记10-使用 PMAlign和Fixture固定Blob工具检测孔

news2024/9/23 13:21:06

使用 PMAlign和Fixture固定Blob工具检测孔

这个示例演示了如何使用 PMAlign 工具和 Fixture 工具来夹持一个 Blob 工具。示例代码将检测支架右上角孔的存在。当点击运行按钮时,将读取新图像。PMAlign 工具运行并生成一个 POSE 作为输出。POSE 是一个六自由度的变换,描述了从运行时坐标空间到训练时坐标空间的转换。一个 POSE 由 TranslationX、TranslationY、旋转、缩放、ScalingX 和 ScalingY 组成。

PMAlign 工具的输出 POSE 随后被传递给 Fixture 工具。Fixture 工具从 PMAlign 工具获取 POSE 信息以及新图像,并创建一个新的输出图像。Fixture 工具的输出图像随后被传递给 Blob 工具。

这三个工具是在此应用程序外部创建的,并在初始化时加载(Form_Load)。PMAlign 工具被训练使用整个支架作为训练图像。在 PMAlign 工具运行后,生成的 POSE 被传递给 Fixture 工具。Fixture 工具从 PMAlign 获取 POSE 信息,并从图像文件工具获取图像,创建一个新图像,然后传递给 Blob 工具。Fixture 工具生成的新图像已经针对支架的新位置进行了校正。Blob 工具的感兴趣区域围绕左侧的孔。当 Blob 工具运行时,结果会被检查以查看是否检测到 blob

1. 创建vpp文件

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

在这里插入图片描述

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

在这里插入图片描述

  1. PMAlign 工具被训练使用整个支架作为训练图像

    1. 抓取训练图像
    2. 框选整个支架
    3. 点击训练区域与原点Tab下的中心原点
    4. 点击运行参数Tab 角度从标称值转为设置上下限45度
    5. 点击训练参数Tab 训练按钮训练图像
    6. 运行工具

在这里插入图片描述

  1. 在 PMAlign 工具运行后,生成的 POSE 被传递给 Fixture 工具。Fixture 工具从 PMAlign 获取 POSE 信息,并从图像文件工具获取图像,创建一个新图像,Fixture 工具生成的新图像已经针对支架的新位置进行了校正

在这里插入图片描述

  1. 运行整个工具后,结果会被检查以查看是否检测到 blob

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

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

在这里插入图片描述

2. 添加引用

using Cognex.VisionPro;
using Cognex.VisionPro.Blob;
using Cognex.VisionPro.CalibFix;
using Cognex.VisionPro.Exceptions;
using Cognex.VisionPro.ImageFile;
using Cognex.VisionPro.PMAlign;

3. 界面设计

添加CogDisplay控件和Button按钮.

在这里插入图片描述

4. 声明变量

        private CogImageFileTool imageFileTool;
        private CogPMAlignTool pMAlignTool;
        private CogFixtureTool fixtureTool;
        private CogBlobTool blobTool;

5. 加载工具

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

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

            imageFileTool = new CogImageFileTool();
            //调用 CogImageFileTool 的 Operator 属性来打开指定路径的图像文件。CogImageFileModeConstants.Read 参数指定以读取模式打开文件
            imageFileTool.Operator.Open(Path.Combine(strBaseDir,ImageFileName),CogImageFileModeConstants.Read);

            string VPPFiles = "G:/VisonProStudy/UsingQB/vpp/";
            //将文件内容反序列化为相应的工具对象
            pMAlignTool = (CogPMAlignTool)CogSerializer.LoadObjectFromFile(VPPFiles + "pmalign_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 Form11_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 BtnRun_Click(object sender, EventArgs e)
        {
            try
            {
                //清空 cogDisplay1 控件中的静态图形,以便在后续处理中显示新的结果
                cogDisplay1.StaticGraphics.Clear();

                imageFileTool.Run();

                pMAlignTool.InputImage = (CogImage8Grey)imageFileTool.OutputImage;
                pMAlignTool.Run();

                if (pMAlignTool.RunStatus.Result != CogToolResultConstants.Accept)
                {
                    throw pMAlignTool.RunStatus.Exception;
                }
                if (pMAlignTool.Results.Count == 0)
                {
                    throw new Exception("PMAlgin工具没找到结果.");
                }

                fixtureTool.InputImage = imageFileTool.OutputImage;
                fixtureTool.RunParams.UnfixturedFromFixturedTransform = pMAlignTool.Results[0].GetPose();
                fixtureTool.Run();
                if (fixtureTool.RunStatus.Result != CogToolResultConstants.Accept)
                {
                    throw fixtureTool.RunStatus.Exception;
                }

                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.Image = imageFileTool.OutputImage;
                //使用 Blob 工具的第一个结果创建图形(边界和质心)并添加到显示区域。
                //使用 PMAlign 工具的第一个结果创建坐标轴图形并添加到显示区域。
                cogDisplay1.StaticGraphics.Add(blobTool.Results.GetBlobs()[0].CreateResultGraphics(CogBlobResultGraphicConstants.Boundary | CogBlobResultGraphicConstants.CenterOfMass), "");

                cogDisplay1.StaticGraphics.Add(pMAlignTool.Results[0].CreateResultGraphics(CogPMAlignResultGraphicConstants.CoordinateAxes), "");
            }
            catch (CogException ex)
            {

                DisplayErrorAndExit("Tool Load Error:" + ex.Message);
            }
            catch (Exception ex) {
                DisplayErrorAndExit("Tool Load Error:" + ex.Message);
            }
            
        }

7. 界面效果

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

8. 项目示例

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

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

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

相关文章

Mybatis(1)

一. Mybatis概述 原本是Apache的一个开源项目叫iBatis,2010年迁移到Google Code旗下,改名为Mybatis Mybatis是一款优秀的持久层框架,是对JDBC的封装Mybatis几乎避免了JDBC所有的手动设置参数以及手动获取结果的操作Mybatis可以使用注解或XML文件来配置和映射,将数据库中的数据…

springboot发送邮箱功能的安全与加密配置?

springboot发送邮箱设置的步骤?springboot发信优势? 为了确保邮件发送过程的安全性和隐私保护,我们需要对 SpringBoot发送邮箱功能进行适当的安全与加密配置。AokSend将详细探讨如何在 SpringBoot项目中实现这些配置,以保障邮件传…

大模型面试题集锦:揭秘阿里24k Star项目背后的争议,非常详细收藏我这一篇就够了

今天分享两个 Github 上开源的不错的项目,以及阿里空 Github 项目的趣闻。 一、开源大模型面试题 大致看了以下,面试题分门别类,还是挺全的。包含 LLM 基础,分布式训练,推理,强化学习等。 二、Awesome Co…

记录|Git工具——下载GitHub项目

目录 前言一、Step 1. 下载Git二、Step2. 用Git Bash 下载到本地更新时间 前言 参考文章: 1、如何使用Git将Github项目拉到本地 2、git 安装、创建仓库、上传项目、克隆下载、常用命令 – 一篇文章总结(适用github / gitee) 3、Git的使用【入…

2024网页设计教程:最新趋势与实用技巧

网页是每个人访问信息的载体,用户点击的按钮、浏览的导航栏和网页界面的视觉性能都与网页制作有关。良好的网页设计代表了友好的使用体验。个人网页、商业网页和社交媒体平台都应该吸引人们的注意,并提供令人印象深刻的客户体验。本文针对网页制作新手&a…

CentOS7.6单机部署RabbitMQ消息队列——实施方案

1、前期环境准备 1.准备一台主机 IP地址主机名角色内存大小192.168.200.10 rabbitmq 消息队列 2G 2. 设置主机名 hostnamectl set-hostname 主机名suexit Ctrlr 3. 设置IP地址然后重启网卡 vim /etc/sysconfig/network-scripts/ifcfg-ens33systemctl restart network 4.…

【一图学技术】8.图解Git工作流程使用 git 解决团队协作中的冲突问题 git 进行版本控制的最佳实践Git 的高级功能

图解Git的工作流程 一、Git常见命令概述 以下是 Git 常用命令的详细作用、使用例子和使用场景: git add 作用:将工作目录中的更改添加到暂存区。暂存区是一个准备下一次提交的区域,它记录了你想要提交的更改。使用例子:git add …

【机器人】关于钉钉机器人如何进行自定义开发问答【详细清晰】

目标:当用户输入问题并钉钉机器人,钉钉机器人进行相应的回答,达到一种交互问答的效果 开发文档参考:https://open.dingtalk.com/document/orgapp/robot-overview 首先进行登录企业,后面如果没有进行登录,会…

html编写贪吃蛇页面小游戏(可以玩)

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>贪吃蛇小游戏</title><style>body {…

Hadoop,ActiveMQ,RabbitMQ,Springboot Actuator未授权访问漏洞(附带修复方法)

十.Hadoop Hadoop是⼀个由Apache基⾦会所开发的分布式系统基础架构&#xff0c;由于服务器直接在开放了Hadoop 机器 HDFS 的 50070 web 端⼝及部分默认服务端⼝&#xff0c;⿊客可以通过命令⾏操作多个⽬录下的数据&#xff0c;如进⾏删除&#xff0c;下载&#xff0c;⽬录浏览…

LSTM--概念、作用、原理、优缺点以及简单的示例代码

LSTM的概念 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种特殊的递归神经网络&#xff08;RNN&#xff09;&#xff0c;最早由Sepp Hochreiter和Jrgen Schmidhuber在1997年提出。LSTM设计的主要目的是解决标准RNN中的长时依赖问题。RNN在处理长序列时&#xff0c…

机房防静电地板和架空网络地板有哪些区别

有好些人把机房防静电地板和网络地板混为一谈&#xff0c;觉的两个就是一样的东西&#xff0c;其实呢&#xff0c;虽说都是高架活动地板&#xff0c;但它们之间的区别大着呢&#xff01;下面和宜缘机房一起来看看防静电地板和网络地板两者都有哪些区别&#xff1f; 1、使用场景…

安全基础学习-RC4加密算法

这里仅仅记录一些基础的概念。后期有需求进一步扩展。 RC4 是一种对称流加密算法&#xff0c;由罗恩里维斯特&#xff08;Ron Rivest&#xff09;于1987年设计。RC4 的设计目的是提供一种简单且高效的加密方法。尽管 RC4 曾经广泛使用&#xff0c;但它的安全性在现代已受到质疑…

精通C++ STL(七):stack和queue的介绍及使用

目录 stack stack的定义方式 stack的使用 queue queue的定义方式 queue的使用 stack stack 是一种容器适配器&#xff0c;专门用于处理后进先出的操作场景。它仅允许在容器的一端进行元素的插入和提取操作。 stack的定义方式 方式一&#xff1a; 使用默认适配器定义栈。 sta…

Linux 进程调度(三)之进程的优先级

目录 一、概述二、进程的优先级1、基础概念2、优先级的意义3、查看优先级4、PRI 和 NI5、修改优先级6、控制进程的优先级的系统调用7、调整优先级的限制 一、概述 在 Linux 中&#xff0c;每个进程都有一个优先级。优先级决定了进程在系统资源分配中的先后顺序。Linux 中的进程…

gin框架中的中断请求c.Abort()方法的作用和使用细节说明

Abort()方法的作用 在gin框架中&#xff0c;如果我们希望中断后续的挂起的请求处理链&#xff08;HandlersChain&#xff09;的请求&#xff0c; 可以使用gin.Context中的这个Abort()方法。请注意&#xff0c;这不会停止当前处理程序。假设您有一个授权中间件&#xff0c;用于…

Vue技术栈-Vue 3 项目组件入门:单文件组件 (SFC)

目录 前言 1.简介 2.安装 Vite 和 Vue 3 3.什么是.vue文件? vue 文件解析 4.什么是VUE的组件? 5.工程化vue项目如何组织这些组件? 6.Vue3关于样式( CSS )的导入方式 7.结语 前言 本篇是在上一篇Vue技术栈-Vite最新版创建一个Vue3项目的基础上的后续,先对Vite这一构…

加密狗创新解决方案助力工业自动化

面临的挑战 早在1991年&#xff0c;COPA-DATA就认识到需要一个既能提供长期保护又能灵活应对的解决方案&#xff0c;以防止软件盗版并确保客户在各种复杂的工业环境下能够顺利使用其产品。这一解决方案不仅要兼容Windows系统&#xff0c;还必须在网络连接受限的情况下&#xff…

Python绘图入门:使用 Matplotlib 绘制折线图

使用 Matplotlib 绘制折线图 数据可视化是数据分析的重要组成部分&#xff0c;通过图表&#xff0c;我们可以更直观地理解数据背后的趋势和模式。Matplotlib 是 Python 最基础也是最常用的绘图库之一&#xff0c;非常适合初学者。本文将带你从零开始&#xff0c;逐步创建和自定…

接口基础知识6:详解http request body(一篇讲完常见请求体)

课程大纲 一、定义 HTTP请求体&#xff08;HTTP Request body&#xff09;&#xff1a;HTTP请求消息的可选部分&#xff0c;仅在请求方法支持且需要发送数据时使用。 POST方法、PUT方法有请求体&#xff0c;GET和HEAD方法没有请求体。 请求头和请求体之间会有一个空行&#…