基于形状的匹配,改进了无数次,其实已经很满意了。
想起刚入门机器视觉那会儿,我们写的代码,无论c++还是c#的,都是调用人家的函数,从来没想过,自己有一天把这些函数代替了。
那时候调用evision的抓线工具gaugeline,事先在工作界面,手动调好抓线工具的参数,然后写程序,要能加载抓线工具这些参数,还要能保存抓线工具参数。
这样的事情不知搞了几多会,用过抓线工具的人都知道,这个工具先放在能抓到线的地方,并设置抓线工具一定的弹性,也就是说,当图像中这个线条在小范围内浮动时,我们的抓线工具加载上来不用动,仍然能找到直线。
这要感谢plc电控的朋友们,他们上料,一般不会偏差0.2mm,所以我们的抓线工具能适应这样的弹性范围变化,跑自动的时候,记得很清楚,当我们抓不到线的时候,总是找plc电控麻烦,说他们上料偏差太大了,他们却说我们的抓线不行,吵过不知多少回,有时改一下抓线工具的弹性,重新保存加载一下抓线工具,有时plc改进上料精度,问题都能解决,大家把项目完成好就行。
说这个有什么用呢?
其实这里边隐藏了匹配一种思想,即匹配时,要有弹性,另外,保存和加载参数的好处也分外明显,自动化需要这个,实在太重要。
我们匹配中要借鉴后面这个思路,也就是说,我们要找的事物特征,很大的概率会在某一区域,这是由自动化特殊的原因(电控和视觉)保证的,我们机器视觉不就是自动化的产物吗?我们可以记住这个区域,下一次找的时候,保持一定的弹性,就能很快找到想要的特征。
匹配时,要再一步提高速度的思路是这样的:
学习时,记住学习的位置,在匹配时用;即学习时保存,匹配时加载参数,应用时,完全是自动化的。
如上图,学习时,我们学习特征“X”的roi矩形如图,然后以roi矩形的left-20,top-20为选定位置,
把整个区域分成三块I,II,III
好,我们匹配时,优先找I区,
然后找II区,最后找III区,这样速度会快不少。
为什么可以这样做,因为你可知道,我们一般不会把重要的特征放到边缘区,原因是,我们怕失去精度,因为,图像边缘区,是很容易畸变的,我们都是从这里趟过去的。
另一个原因就是,我们一开始就讲了,你学习特征的区域,在plc电控保证下,不会有多少变化
所以,搞视觉的人,一般都会把特征往中间放,即使你不知道是为什么,也没关系!
其实从高斯(正态)分布来看,中间出现的概率极大,这个事情和我们的眼睛也是契合的,也就是说,直觉就是这样,也就是说,注意力在中间,这叫做focus。
今天编程试了一下,效果不错,这也算是过往的贡献吧!
我们这种方式最好是只找I区域,最差找三个区域,在今天之前,我一直全区域去找,虽然已经很快了,但重复的事情会触发新的发现!