程序中如何调用动态库并运行,取出结果呢?
我们这一节就介绍一下:
第一,取一帧图像,传给工具组运行一下(即工具组运行一次):
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轴的程序也加上。