零件测量是属于机器视觉当中的典型的应用。
项目要求:测量距离W,并将结果显示在界面上(图片是VisionPro自带的图片)。
项目描述:我们给一些零件的图,然后在里面测量一些宽度还有一些圆的半径等信息。
项目流程:
零件尺寸测量与显示
模板匹配
- 打开 VisionPro ® QuickBuild 项目
- 点击工具条上的保存按钮,保存一下项目。
- 默认情况下,里面有一个作业:CogJob1
- 双击 Image Source,指定要测量的图
- 点击运行可以切换图片资源。
- 选择模板匹配工具 CogPMAlignTool
- 把图像资源传入到 CogPMAlignTool 工具的 InputImage 上
- 双击PMA工具,进入到模板的训练与匹配
- 如果没有图像需要先抓取训练图像,如果有训练图像则可以直接开始训练(第一次都需要先抓取一下)
- 选择训练模式
- 把左上角的选择框调整位置和大小,框选住我们的零部件
- 设置中心原点
- 设置一下运行参数:允许正负180的旋转(零部件摆放位置不确定)。需要先把角度的三角符号改到后面(是选择标称值还是一个范围)。
- 设置一下运行参数:是否有缩放(同样的零部件,有大有小)
- 设置一下运行参数:查找概数:指定要寻找的结果数(要查找多个的话,可以设置一下)
- 点击开始训练
- 查看训练结果,切换到图形页上(勾选上:显示精细):可以查看到训练的一些特征(根据这些特征去匹配)
- 查看运行结果:发现三张图像都匹配出来了(绿色框框出来的结果)
- 模板匹配就做完了
- PS:可以把工具条上的“显示工具提示”打开,这样操作面板时就会有提示效果。
坐标系转化(重建修正坐标)
现在模板匹配做完了,我们来重建坐标系
- 添加 CogFixtureTool 工具
- 传入图像源
或者 - 设置一下坐标转换(我们是把PMA的运行结果中的位置信息传递给我们的坐标转换,让他进行坐标转换,重建坐标)
或者 - 查看一下Fixture的结果,注意需要选中:CogFixtureTool.outputImage
- 依次点击运行,查看结果:这是我们重建好的以零件的中心点来进行的一个新的坐标系
卡尺工具
现在做完了匹配和定位之后,我们来利用卡尺进行测量
- 添加 CogCaliperTool 工具
- 传入图像源
- 双击进入卡尺工具,设置一下卡尺(尽量选择一张正的图,方便设置)。
- 首先确定卡尺要测量的边缘,拖拽卡尺选框,移动到要测量的位置
- 设置边缘对(单边或者搜索边缘对两种模式):左边是由暗到明,右边是由明到暗
- 点击下运行,保存下设置:
- 选中 LastRun.InputImage 查看结果
- 设置边缘对宽度。宽度如果设置的太小,找的可能不准确,我们可以稍微设置大一点,比如:200
- 依次点击运行,可以看到所有的边缘对都找到了(宽度都测量出来了)
标注宽度
现在做完测量之后,我们想把宽度标注出来,我们可以选择 CogCreateGraphicLabelTool 工具
- 添加 CogCreateGraphicLabelTool 工具
- 要标注到哪个图像上,首先要选择输入图像
- 想标注一个什么结果,想标注测量出来的宽度信息。首先在卡尺当中把宽度添加进来
- 把宽度输入进去
- 打开图形标签,设置一下显示的是小数double
- 把图形标签面板运行一下,保存一下。
- 运行项目查看结果。
- 标注设置里面有个实时位置信息(也可以拖拽图像上的Label来移动到合适的位置)
- 因为我们放在 Fixture 坐标系上的,所以宽度的标注是动态变化的。
- 调整double位数格式: Formatted: {D:F2}
- 在数字前面加上"宽度"两个汉字
零件尺寸测量与显示(使用脚本)
没有脚本的已经演示完了,接下来我们演示一下如何利用脚本来实现测量显示效果(低于9.0的版本)。
ToolBlock
- 脚本的实现有很多方式,我们这里使用 ToolBlock 的方式来实现:
- 打开 ToolBlock 工具,把其他控件工具都拖到 ToolBlock 里面去(把CogCreateGraphicLabelTool工具删除了),这时 ToolBlock 就调整好了。
- 图像传给 ToolBlock
- 重新给PMA工具和Fixture工具指定输入图像
脚本编程
- 选择 C# 的高级脚本
- 认识脚本区
- 代码编写区域
- 代码实现
// 1. 在此处写代码,定义变量的地方
// 我们要放置的是一个图形标签,所以定义一个图形标签
CogGraphicLabel myLabel = new CogGraphicLabel();
// 2.在此处写代码(获取工具以及运行完工具获取运行的结果)
// SetXYText:设置标签的位置和显示的文字信息
myLabel.SetXYText(100,100,"HelloWorld");
// 3. 在此处写代码(把前面定义的一些图形之类的结果输出到图像上面)
// mToolBlock 工具面板
// AddGraphicToRunRecord:添加图像到输出的运行结果记录上
// 1. graphic:要添加的图形
// 2. baseRecord:运行记录 固定的 lastRecord
// 3. recordName:放置的位置,图形信息(可以去复制,后面是数字1)
// 4. annotation:说明信息
mToolBlock.AddGraphicToRunRecord(myLabel,lastRecord,"CogFixtureTool1.OutputImage","说明信息");
- 运行一下
- 修改坐标
// 2.在此处写代码(获取工具以及运行完工具获取运行的结果)
// SetXYText:设置标签的位置和显示的文字信息
myLabel.SetXYText(0,0,"HelloWorld");
- 调整颜色和大小
// 2.在此处写代码(获取工具以及运行完工具获取运行的结果)
// SetXYText:设置标签的位置和显示的文字信息
myLabel.SetXYText(0,0,"HelloWorld");
// 调整颜色和大小
myLabel.Color = CogColorConstants.Red;
myLabel.Font = new Font("楷体",20);
- 再次调整位置
// 2.在此处写代码(获取工具以及运行完工具获取运行的结果)
// SetXYText:设置标签的位置和显示的文字信息
myLabel.SetXYText(10,-50,"HelloWorld");
// 调整颜色和大小
myLabel.Color = CogColorConstants.Red;
myLabel.Font = new Font("楷体",20);
- 获取卡尺测量宽度的结果
// 2.在此处写代码(获取工具以及运行完工具获取运行的结果)
// 获取卡尺工具以及卡尺的测量结果
// 定义一个卡尺(建议去CogToolBlock1中复制)
CogCaliperTool caliper = null;
caliper = mToolBlock.Tools["CogCaliperTool1"] as CogCaliperTool;
// 获取宽度结果
// caliper.Results[0].Width
// SetXYText:设置标签的位置和显示的文字信息
myLabel.SetXYText(10,-50,"宽度:" + caliper.Results[0].Width.ToString("F2"));
// 调整颜色和大小
myLabel.Color = CogColorConstants.Red;
myLabel.Font = new Font("楷体",20);
- 在外层运行,查看结果
- 标注的内容是随着图形的变化而变化的,如果大家想把内容标注在图形的左上角,那么可以选择标注在原始图像上
// 3. 在此处写代码(把前面定义的一些图形之类的结果输出到图像上面)
// mToolBlock 工具面板
// AddGraphicToRunRecord:添加图像到输出的运行结果记录上
// 1. graphic:要添加的图形
// 2. baseRecord:运行记录 固定的 lastRecord
// 3. recordName:放置的位置,图形信息(可以去复制,后面是数字1)
// 4. annotation:说明信息
// mToolBlock.AddGraphicToRunRecord(myLabel,lastRecord,"CogFixtureTool1.OutputImage","说明信息");
mToolBlock.AddGraphicToRunRecord(myLabel,lastRecord,"CogPMAlignTool1.InputImage","说明信息");
码字不易,点个赞再走呗!
画外篇
你现在支持年轻人写博客吗?