VisionProC#联合编程火花塞距离检测与VisionPro操作
本章示例检测火花塞的A、B、C的距离 展示了VisionPro的操作以及C#联合编程的操作
VisionPro示例
使用的工具有:PMA模板匹配工具用来匹配多个火花塞 Fixture坐标空间转换工具 以及三个TBlock工具里面包含找线 、点到点距离、卡尺、创建线到点的平分线、点到线段的距离、文本标签显示
PMA模板训练工具 尽量找每个图片的共同特征 如有匹配不到 旋转角度 缩放打开 或调低阈值
A距离:
找线工具1
找线工具2
在添加线段到线的距离 把找线1的线和找线2的线段的输出参数给线段到线的距离即可在文本标签显示 用的是Formatted 自定义文本 保留2位小数
效果:
B距离:
找线工具1找到上面的线
卡尺卡出这俩的边缘对
然后创建线到点的平分线
然后添加线段到线的距离 把找线1的线段 和创建出来的平分线输出的线的输出参数传给线段到线
效果:
C距离:
卡尺卡出它的边缘对
然后创建线到点的平分线 在添加点到线的距离
我们在测A距离的时候已经找到那条线了 所以我们可以直接把找线1的线段输出过来 不需要再重新找了
C#联合编程示例
上面我们Vp已经操作完成还是在外面添加一个工具块 把这些工具拖到工具块里(上章筛子统计已经详细讲过以及注意事项)
1.还是在TBlock工具块保存 保存不带图像的保存到我们的Debug文件下 C#加载的时候使用相对路径就行
2..程序在启动的时候加载我们的vpp方案
界面展示 我们一般都会使用cogRecordDisplay控件来显示结果图像 (前两章已经见过如何导入Winfrom控件以及cogRecordDisplay与cogDisplay区别)
前面我们说过只需要获取TBlock工具就行
CogToolBlock tb;tb = CogSerializer.LoadObjectFromFile("火花塞.vpp")as CogToolBlock;
这里我是文件弹窗选择单个指定图片显示的用到了OpenFileDialog控件
注:转换图像一定要注意 是彩图还是灰度图 不然不会显示图片 博主当时用的彩色图片就没有显示出来最后发现是图片颜色问题
ICogImage img;//选择图片private void button2_Click(object sender, EventArgs e){if (openFileDialog1.ShowDialog() == DialogResult.OK){Bitmap bitmp = new Bitmap(openFileDialog1.FileName);img = new CogImage8Grey(bitmp);cogRecordDisplay1.Image = img;//Fit()将缩放图像及其图形以适应显示控件。cogRecordDisplay1.Fit();tb.Inputs["OutputImage"].Value = img;}}
运行TB工具块 上章我们讲过获取结果有俩种方法 一种和vp写脚本写法一样获取工具(下面列子就是) 博主写习惯这样了 第二种方法是在vp里面把结果拖到输出参数哪里 然后自己可以修改参数名 根据参数名来获取写法跟上方赋值图片写法一样只是参数不一样 一个是输入参数 一个是输出参数
tb.Run();cogRecordDisplay1.Record = tb.CreateLastRunRecord().SubRecords[0];//显示第一张图 也就是vp工具下拉框一堆图片 这里索引为0 就是第一张CogDistanceSegmentLineTool disA = tb.Tools["CogDistanceSegmentLineTool1"] as CogDistanceSegmentLineTool;CogDistanceSegmentLineTool disB = tb.Tools["CogDistanceSegmentLineTool2"] as CogDistanceSegmentLineTool;CogDistanceSegmentLineTool disC = tb.Tools["CogDistanceSegmentLineTool3"] as CogDistanceSegmentLineTool;label4.Text = disA.Distance .ToString("F2")+ "/cm";label5.Text = disB.Distance.ToString("F2") + "/cm";label6.Text = disC.Distance.ToString("F2") + "/cm";
第二种获取结果写法
还有一种获取结果写法 不需要获取某个工具 但是需要在vp里添加输出参数 然后把显示那个工具的值拖个输出参数即可
注:名字一定要一样// 通过Outputs属性获取TB的输出参数// 获取TB中名称为 DianShu 的输出参数的值label2.Text = tb.Outputs["Count"].Value.ToString();
这里我没有在vp添加输出参数 所以用的第一种
在这里还写了编辑作业窗体也就是TBlock工具(Edits窗体)
Edits edits = new Edits(img);edits.ShowDialog();
其实这里不仅光传图片的也应该传TB的vpp 因为这样的话 我们程序始终保持一个vp降低性能损耗也能避免新窗体在新建一个vp为null的问题 以及代码减少的问题 这里博主后续才考虑这些问题 就不展示修改之后的了思路已经说出来了 有兴趣的可以自己修改 或者私信博主免费领取课件
后续这种优化方案 可查看我下一篇的联合编程相机开发案例
ICogImage img;public Edits(ICogImage img){InitializeComponent();this.img = img;}CogToolBlock tb;private void Edits_Load(object sender, EventArgs e){tb = CogSerializer.LoadObjectFromFile("火花塞.vpp") as CogToolBlock;cogToolBlockEditV21.Subject = tb;tb.Inputs["OutputImage"].Value=img;}private void button1_Click(object sender, EventArgs e){CogSerializer.SaveObjectToFile(tb, "火花塞.vpp");}
效果展示:
编辑作业窗体
完整代码:
Form1:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Cognex.VisionPro;
using Cognex.VisionPro.Dimensioning;
using Cognex.VisionPro.Display;using Cognex.VisionPro.ToolBlock;namespace 火花塞
{public partial class Form1 : Form{public Form1(){InitializeComponent();}CogToolBlock tb;ICogImage img;//选择图片private void button2_Click(object sender, EventArgs e){if (openFileDialog1.ShowDialog() == DialogResult.OK){Bitmap bitmp = new Bitmap(openFileDialog1.FileName);img = new CogImage8Grey(bitmp);cogRecordDisplay1.Image = img;//Fit()将缩放图像及其图形以适应显示控件。cogRecordDisplay1.Fit();tb.Inputs["OutputImage"].Value = img;}}//识别private void button3_Click(object sender, EventArgs e){tb.Run();cogRecordDisplay1.Record = tb.CreateLastRunRecord().SubRecords[0];CogDistanceSegmentLineTool disA = tb.Tools["CogDistanceSegmentLineTool1"] as CogDistanceSegmentLineTool;CogDistanceSegmentLineTool disB = tb.Tools["CogDistanceSegmentLineTool2"] as CogDistanceSegmentLineTool;CogDistanceSegmentLineTool disC = tb.Tools["CogDistanceSegmentLineTool3"] as CogDistanceSegmentLineTool;label4.Text = disA.Distance .ToString("F2")+ "/cm";label5.Text = disB.Distance.ToString("F2") + "/cm";label6.Text = disC.Distance.ToString("F2") + "/cm";}private void Form1_Load(object sender, EventArgs e){tb = CogSerializer.LoadObjectFromFile("火花塞.vpp")as CogToolBlock;}//编辑作业private void button1_Click(object sender, EventArgs e){Edits edits = new Edits(img);edits.ShowDialog();}}
}
Edits:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Cognex.VisionPro;
using Cognex.VisionPro.ToolBlock;namespace 火花塞
{public partial class Edits : Form{ICogImage img;public Edits(ICogImage img){InitializeComponent();this.img = img;}CogToolBlock tb;private void Edits_Load(object sender, EventArgs e){tb = CogSerializer.LoadObjectFromFile("火花塞.vpp") as CogToolBlock;cogToolBlockEditV21.Subject = tb;tb.Inputs["OutputImage"].Value=img;}private void button1_Click(object sender, EventArgs e){CogSerializer.SaveObjectToFile(tb, "火花塞.vpp");}}
}