VisionPro+C#学习之路1_线段检测
Posted 金色的费米
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VisionPro+C#学习之路1_线段检测相关的知识,希望对你有一定的参考价值。
本人最近刚入visionpro与C#界面编程的坑,所以准备边学习边在此做个记录,并且与大家分享学习过程中遇到的困难与收获的心得,若存在错误以及不足之处,请多多指教。
注
1 本次项目中并不需要在visionPro中编写脚本,若后续有脚本辅助,会在此提醒。
2 流程图中的连线,最好是设置完一个工具再连下一个,这样的话会方便自己理解,一步一个脚印
确定流程
首先,确定项目需求,需求为:检测输入图像中的某条线段,并且图像如何旋转,依旧能够检测出该条线段。所以可以分为如下步骤实现该需求。
1.旋转图像
2.模板匹配—标定—坐标系定位 (为了确定一个坐标系的基准,确保图像无论如何旋转,都可以得到当前坐标系与基准坐标系的变换关系)
3.检测线段
流程图如下所示:
1.旋转图像
图像旋转:
第一步:加载想要旋转的图像,在这里用了“CogImageFileTool”工具,CogImageFileTool主要的作用就是加载本地图像或者保存最终图像至本地的某个位置。
第二步:用到了仿射变换工具“CogAffineTransformTool”。
首先设置区域形状(就是一个包含目标图像的矩形框),我这里用的是CogRectangleAffine,作用就是框选想要进行仿射变换的区域。
因为仿射变换做旋转,本质是对这个框做旋转,只不过这个框在旋转前后,在输出图像中是看不到的(这一点我说的也有些迷糊,实际操作几次就都明白了),反正就是框逆时针旋转30°,对应的图像看起来是顺时针旋转了30°(就是坐标系发生了改变)
工具界面中有一个区域,名为选择模式,注意当前选择的是原点、中心、还是3点。我这里选择的是中心,框的中心就是图像的中心,框的边长就是图像的边长。旋转和倾斜暂时设为 0 就行。
这是可以设置一下旋转为30(deg是角度制,rad是弧度制),点击左上角运行,可以发现右面显示区域Current.InputImage中的框变成了这样。
此时可以看到LastRun.OutputImage是这样的
这样就完成了图像的旋转。
2.模板匹配—标定—坐标系定位
之前为了测试,将CogRectangleAffine中的旋转设为了30,现在将它设置成0,然后就不要动了,开始下面的流程了。
接下来就是模板匹配了,可以看到,图像中最有效的特征就为两个圆形的眼睛,一个三角形的嘴,因此我们要将这三个特征标记出来,作为我们的模板,哪怕将图旋转后,也能够检测出我们的这三个特征。
第一步:模板匹配
我首先引入了一个CogToolGroup,这个工具的作用就是分块并不对整个流程的运行造成影响,把重复性的工具都放在这里,让整个流程图看起来更加简洁。
模板匹配用到的工具是CogPMAlignTool,界面是这样的。
1.点击“抓取训练图像”,然后在右侧显示区域的下拉列表中选择Current.TrainImage。
2,在工具栏中选择“训练区域与原点”,在这里面可以看到区域模式、形状、模式啥的,反正就用这个框,把左面的眼睛包住,然后训练原点移到眼睛中心就行。(最初框和中心都在左上角)。
3. 点工具栏中的运行参数。区域中的角度默认是标称值,我们要将其变为下限-180,上限180,因为图像后续要进行旋转,缩放弄成0.8~1.2。
右上角的接受阈值就是先计算出目标与模板之间的一个分数,分数高于阈值的就算它是匹配上的目标,低于阈值的就被舍弃了。
剩下的搜索区域,图形默认就行。
一切参数设置好了后,回到“训练参数”中,点击“训练”,这样这个模板就训练完了。
右眼和嘴的模板匹配和左眼的流程一样,就不多说了,贴两张图得了。
右眼图:
嘴的图:
模板匹配这样就完成了,如果检测出了多个目标,调整接受阈值的大小就可以解决这个问题。
第二步:图像标定
利用 CogCalibPointToPointTool 工具。界面是这样的
1 首先还是点击“抓取校正图像”,然后:
2 还记得上面模板匹配中,每个模板,都有一个框和一个中心,中心坐标为Patter.Origin.TranslationX与Patter.Origin.TranslationY(自己到终端里添加)
一共三个模板,所以有三组坐标,分别代表着左眼,右眼,嘴的中心。
将这三组坐标传入CogCalibPointToPointTool中去,可以在界面中看到,未校正X和未校正Y中,每一行就代表着我们传入的中心坐标。
原始的已校正的X和Y是自己算的 (这一块我说的比较拗口,多试几次就明白了),那究竟是怎么算的呢?未校正的X,Y,是在图像坐标系中的坐标,图像坐标系以左上角为原点(0,0),而我们现在发现,左眼右眼是水平对称的,所以我们可以构建一个新的坐标系,令“嘴的中心” 与 “左眼右眼连线的中间点” 的中间点 为新坐标系下的(0,0)点,这样的话,根据未校正X,Y的三个中心间的坐标关系,可以计算出当前坐标系下的三个中心的坐标,然后将其输入至原始的已校正的X,Y中。
3.工具栏 “运行参数”中已校正的空间名称可以根据其起到的作用自定义,方便后续引用,我这里就起名为“PTP”
4. 工具栏“图形”中像这样就行。
一切参数都设置好了后,点击工具栏“校正”中的计算校正,然后点击左上角的红色三角键。这样的话就标定好了。标定的作用就是无论图像怎么旋转,只要有三个特征目标的中心点,那么就能够与原始的已校正的三个点对应上,进而计算出校正转换的结果
第三步:再来一次模板匹配,这一就是将目标整体包围进去了,和上面的模板匹配步骤一样,只不过是这次框选的是整张脸。
第四步:坐标点的定位
用到了CogFixtureTool
首先按流程图连线,之后界面是这样的,照着设置就行,
设置完了点左上角红色三角键,这个的作用是定位,里面的一些参数设置我也不太理解,以后再说吧,先知道要实现某个功能,都是哪几个工具组合就行。
经过CogFixtureTool处理后会输出一个图像,我们就在这个图像上找线段。
3.检测线段
利用CogFindLineTool工具可以检测图像中的线段,但是你得先知道线段的大概位置,界面如下所示。
1 我这里设置了100个卡尺,搜索长度就是每个卡尺的纵向长度,投影长度就是切向长度,搜索方向就看卡尺上面的箭头就行,无非就是从里向外搜索或者从外向里搜索,我这里是从外向里搜索。
关键是所选空间名称,
还记得 “模板匹配—标定—坐标系定位” 的 第二步“图像标定” 的 第三点中,我们设置了输出的已校正的空间名称为PTP,所以这里就要选择PTP\\Fixture,指的就是标定再定位的空间。
2 卡尺设置中,我们想找一条线段,不用找边缘对,所以选择“单个边缘”,极性选择任何极性就行。
过滤一半像素主要用于边缘筛选,其目的主要为了消除噪声和增强峰值。具体我说不明白,可以参见这位大哥写的文章卡尺工具原理讲解
对比度阈值:实际上就是实际图像中边缘两侧的像素差值 ,小于对比度阈值的边会被忽略,大于对比度阈值的边会被保留。
拟合器中忽略的点数指,举个栗子:我用M个卡尺,假设找到了N个点(因为不能保证每个卡尺都找到符合条件的点),但是我只想用N-5个点拟合,因为我觉得有一些点拟合之后效果并不好,所以忽略的点数就要设置为5,忽略的是找到的点中分数最低的5个点,当然这只是个大白话的例子,目的就是希望大家能够理解。
所有参数设置好了之后,就可以点击左上角红色三角键运行了
至此,所有参数都设置好了,运行一下。
旋转0°:
旋转30°:
旋转 -30°
4.总结
其实这个例子很简单,就是参照官方示例的“Calibration And Fixturing”
学习的意义主要是把模板匹配,标定,定位那里搞明白了就行,这几个工具搭配起来使用的范围还是很广泛的,后续无论是找线还是找圆都照葫芦画瓢就行了。本文可能存在错别字,有些话说的不透彻,因为我也是刚接触这门工具,从零开始学习,希望大家能够多多包涵,有问题一起讨论,谢谢。C#的界面设计有时间再发吧。
以上是关于VisionPro+C#学习之路1_线段检测的主要内容,如果未能解决你的问题,请参考以下文章
菜鸟之路——Python学习之串口通信(与STC89C51)源码及打包发布试水
深度学习之目标检测常用算法原理+实践精讲 YOLO / Faster RCNN / SSD / 文本检测 / 多任务网络