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

article/2024/2/25 11:14:03

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

我们这一节就介绍一下:

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

  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轴的程序也加上。


http://www.ngui.cc/article/show-1753745.html

相关文章

【并发编程】volatile实现原理解析

📫作者简介:小明Java问道之路,2022年度博客之星全国TOP3,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于…

go使用aes加密算法

工具代码 package toolimport ("bytes""crypto/aes""crypto/cipher" )// AES加密函数 var key []byte []byte("0#3456789ABCDEF") //todo 记住这个长度只能是16 24 32 如果不是的话话会报错 func Encrypt(data []byte) ([]byte, er…

opencv学习二:加载显示图片

文章目录 加载显示图片(一)函数1.imread()读取图片(1)matplotlib和opencv中imread函数的区别 加载显示图片 (一)函数 1.imread()读取图片 Mat imread(const string& filename, int flags1 );第一个参…

深入理解Java中继承的高级使用方案

摘要: 继承是Java中的一项强大的特性,它允许子类从父类中继承属性和方法。然而,继承的高级使用方案涉及更复杂的概念和技术,可以帮助开发人员构建更加灵活、可维护和可扩展的代码。本文将深入探讨Java中继承的高级用法&#xff0c…

MDK5改造之格式化以及文件函数注释插件和主题应用

MDK5插件以及主题应用 前言一、主题修改1、主题文件下载2、主题应用二、插件安装以及使用1.下载插件2、插件使用步骤前言 为了写代码的心应手,先对MDK5进行改造 提示:以下是本篇文章正文内容,下面案例可供参考 🎉参考了其他大师的文章,链接如下: MDK5插件:代码格式整理、…

如何在WordPress中批量替换图片路径?

很多站长在使用WordPress博客或者搬家时,需要把WordPress文章中的图片路径进行替换来解决图片不显示的问题。总结一下WordPress图片路径批量替换的过程,方便有此类需求的站长们学习。 什么情况下批量替换图片路径 1、更换了网站域名 有许多网站建设初期…

uniapp 微信小程序连接蓝牙卡死

解决方法,需要同意隐私保护协议,否则不能开启蓝牙权限和定位权限,会导致定位失败

制作一个RISC-V的操作系统二-RISC-V ISA介绍

文章目录 ISA的基本介绍啥是ISA为什么要设计ISACISCvsRISCISA的宽度知名ISA介绍 RISC-V历史和特点RISC-V发展RISC-V ISA 命名规范模块化的ISA通用寄存器Hart特权级别Control and Status Register(CSR)内存管理与保护异常和中断 ISA的基本介绍 啥是ISA …

css如何设置文本添加下划线

css文本添加下划线 text-decoration: underline;text-decoration相关属性参数 参数描述none默认。定义标准的文本。underline定义文本下的一条线。overline定义文本上的一条线。line-through定义穿过文本下的一条线。blink定义闪烁的文本。inherit规定应该从父元素继承 text-…

Ext4文件系统解析(一)

1、前言 熟悉Linux操作系统的都应该或多或少的了解或者使用过Ext4文件系统。 接下来,会简单介绍Ext4文件系统的一些特性和工作原理。 2、常用概念 在介绍Ext文件系统之前,先简单描述一些相关概念。 块(Block):Ext文件系统存储分配的基本单…