工业机器视觉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

相关文章

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Python yield与yield from的简单使用方式

《Pythonyield与yieldfrom的简单使用方式》生成器通过yield定义,可在处理I/O时暂停执行并返回部分结果,待其他任务完成后继续,yieldfrom用于将一个生成器的值传递给另一... 目录python yield与yield from的使用代码结构总结Python yield与yield

Go语言使用select监听多个channel的示例详解

《Go语言使用select监听多个channel的示例详解》本文将聚焦Go并发中的一个强力工具,select,这篇文章将通过实际案例学习如何优雅地监听多个Channel,实现多任务处理、超时控制和非阻... 目录一、前言:为什么要使用select二、实战目标三、案例代码:监听两个任务结果和超时四、运行示例五

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3