工业机器视觉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轴的程序也加上。

你可能感兴趣的:(机器视觉)