工业机器视觉megauging(向光有光)使用说明书(十四,轻量级的visionpro)

本文主要是介绍工业机器视觉megauging(向光有光)使用说明书(十四,轻量级的visionpro),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

程序中如何调用动态库并运行,取出结果呢?

我们这一节就介绍一下:

第一,取一帧图像,传给工具组运行一下(即工具组运行一次):

  meGaugingExt1.ToolGroupRun();//这个就是我们相机1运行一次,把图像给所有工具去处理

相机2取一帧图像运行一下,类同,

meGaugingExt2.ToolGroupRun();

相机三也一样操作,meGaugingExt3.ToolGroupRun();

这样我们就把相机和工具组绑定在一起了,这个和visionpro很像

第二,工具组中的工具,我如下定义:

 MeGaugingExt.ImageSourceForm secondhello =null;//第一个工具,图像源

  MeGaugingExt.FormBlob firstHello = new MeGaugingExt.FormBlob();     //斑blob form
        MeGaugingExt.ContourFigure shapeMatch = null;//形状匹配form
        MeGaugingExt.Fixture thirdhello = null;//fixture1 form,跟随blob
        MeGaugingExt.Fixture thirdhello1 = null;//fixture2 form,跟随形状匹配

        MeGaugingExt.CaliLG caliform = null;//九点标定form

 

第二,工具组运行一次,我们给上面定义的工具赋值:(以相机1和工具组1为例,相机2,相机3类同),meGaugingExt1与相机一捆绑在一起,代表工具组1.

  meGaugingExt1.ToolGroupRun();

    secondhello = meGaugingExt1.getImage();

  if (secondhello != null)

{ firstHello = meGaugingExt1.getBlobMatch();} 

 if (meGaugingExt1.cali传递blob)
            {
             
                caliform = meGaugingExt1.getcali();
            }
            if (meGaugingExt1.blob传递fix)
            {
                   thirdhello = meGaugingExt1.getfixt();//fixture1 for blob              
                           
                globRet = thirdhello.Fix_LT;//
                globfixgl = thirdhello.Fix_GL;//线,相对定位

            }
            if (meGaugingExt1.cali传递matchshape)
            {
                shapeMatch = meGaugingExt1.getshape();//这句话很重要202303201458,刚才所有异常都和他相关。
                globRetShape = shapeMatch.Fix_LT;
            }
            if (meGaugingExt1.matchshape传递fixture2)
            {
                //要有fixture2的连线,才能执行下面这句被注释的话202311301557
                  thirdhello1 = meGaugingExt1.getfixt2();//fixture2 for shapematch
            }

第三,上面第二中注释为红色加粗的,是相机1对应的工具组运行一次后,可以取到的结果。

下面这句话是传递标定后的坐标系,给坐标变换用的:

 if (firstHello != null)
                    m_roiCoord显示1.m_RoiBase.DragOrgEx(new PointF((float)(firstHello.Frame_X / 2f), (float)(firstHello.Frame_Y / 2f)), firstHello.Frame_A);

//这里除以2f的原因是显示是1024*768变成512*384,主要在picturebox1_paint中用。

第四,还有一些取结果的操作在picturebox1_paint中,比如轮廓之类的。大家详细查看

第五,这里主要讲一下坐标变换

我们要把像素转换到毫米坐标,靠的是九点标定,这里已经传递过来,我们直接调用就好:

tempframept = m_roiCoord显示1.m_RoiBase.mapPoint(new PointF((float)globRet.startPt.X, (float)globRet.startPt.Y), 2);//比例2,斑的中心位置针对机器人坐标的变换
                     float 均值x = (float)((tempframept.X) / 间距);
                     float 均值y = (float)((tempframept.Y) / 间距);//换算为mm坐标

                     textBox1.Text = "";
                     textBox1.Text += "斑心x,y:" + 均值x.ToString() + "mm ;" + 均值y.ToString() + "mm \r\n";

这个是计算找到斑的斑心

另一个是找到直线的起始点和终点的毫米坐标

 tempframept1 = m_roiCoord显示1.m_RoiBase.mapPoint(new PointF((float)globRet.endPt.X, (float)globRet.endPt.Y), 2);//比例2,斑的中心位置针对机器人坐标的变换              
                     tempframept = m_roiCoord显示1.m_RoiBase.mapPoint(new PointF(globfixgl.startPt.X, globfixgl.startPt.Y), 1);//查看返回,已经处理过比例了202210061055
                     均值x = (float)((tempframept.X * 2) / 间距);
                     均值y = (float)((tempframept.Y * 2) / 间距);//换算为mm坐标
                     textBox1.Text += "抓线的起点:" + 均值x.ToString() + "mm;" + 均值y.ToString() + "mm \r\n";

                     tempframept = m_roiCoord显示1.m_RoiBase.mapPoint(new PointF(globfixgl.endPt.X, globfixgl.endPt.Y), 1);
                     均值x = (float)((tempframept.X * 2) / 间距);
                     均值y = (float)((tempframept.Y * 2) / 间距);//换算为mm坐标
                     textBox1.Text += "抓线的终点:" + 均值x.ToString() + "mm;" + 均值y.ToString() + "mm \r\n";

上面的问题比较容易一点,下面略微复杂一点:

你要知道,我们的坐标系有时你怎么旋转,都转不到你想要的坐标系,只有到位了,翻转才可以,所以我们引入了坐标系翻转,下面注意两个问题:

第一,坐标系翻转后怎么画出来?代码如下:

    if (caliform.m_bcoord翻转)         
                { 
                    m_roiCoord显示1.m_RoiBase.convertCoordinate();
                    m_roiCoord显示1.m_RoiBase.DrawLineAndRect(g, new Pen(Color.Red, 1)); }

第二,坐标系翻转后怎么计算我们想要的值?代码如下:

   if (caliform.m_bcoord翻转)

{

  tempframept = m_roiCoord显示1.m_RoiBase.mapPointTest(new PointF((float)globRet.startPt.X, (float)globRet.startPt.Y), 2);//比例2,斑的中心位置针对机器人坐标的变换
                     float 均值x = (float)((tempframept.X) / 间距);
                     float 均值y = (float)((tempframept.Y) / 间距);//换算为mm坐标

                     textBox1.Text = "";
                     textBox1.Text += "斑心x,y:" + 均值x.ToString() + "mm ;" + 均值y.ToString() + "mm \r\n";

}

我们的程序里只设计了针对x轴,翻转y轴,应该是够用了,如果不够用,告诉我,我们再探讨,看是否把针对y轴,翻转x轴的程序也加上。

这篇关于工业机器视觉megauging(向光有光)使用说明书(十四,轻量级的visionpro)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

java中XML的使用全过程

《java中XML的使用全过程》:本文主要介绍java中XML的使用全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录什么是XML特点XML作用XML的编写语法基本语法特殊字符编写约束XML的书写格式DTD文档schema文档解析XML的方法​​DOM解析XM

使用Java实现Navicat密码的加密与解密的代码解析

《使用Java实现Navicat密码的加密与解密的代码解析》:本文主要介绍使用Java实现Navicat密码的加密与解密,通过本文,我们了解了如何利用Java语言实现对Navicat保存的数据库密... 目录一、背景介绍二、环境准备三、代码解析四、核心代码展示五、总结在日常开发过程中,我们有时需要处理各种软

使用Nginx配置文件服务器方式

《使用Nginx配置文件服务器方式》:本文主要介绍使用Nginx配置文件服务器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 为什么选择 Nginx 作为文件服务器?2. 环境准备3. 配置 Nginx 文件服务器4. 将文件放入服务器目录5. 启动 N

使用nohup和--remove-source-files在后台运行rsync并记录日志方式

《使用nohup和--remove-source-files在后台运行rsync并记录日志方式》:本文主要介绍使用nohup和--remove-source-files在后台运行rsync并记录日... 目录一、什么是 --remove-source-files?二、示例命令三、命令详解1. nohup2.

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.

spring security 超详细使用教程及如何接入springboot、前后端分离

《springsecurity超详细使用教程及如何接入springboot、前后端分离》SpringSecurity是一个强大且可扩展的框架,用于保护Java应用程序,尤其是基于Spring的应用... 目录1、准备工作1.1 引入依赖1.2 用户认证的配置1.3 基本的配置1.4 常用配置2、加密1. 密

WinForms中主要控件的详细使用教程

《WinForms中主要控件的详细使用教程》WinForms(WindowsForms)是Microsoft提供的用于构建Windows桌面应用程序的框架,它提供了丰富的控件集合,可以满足各种UI设计... 目录一、基础控件1. Button (按钮)2. Label (标签)3. TextBox (文本框

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue