我们公司有个做机器视觉算法的大牛,这人编程有强迫症,不喜欢写硬代码,然后他接到一个任务,就是在一个类似电脑机箱的设备上做视觉算法,检查这个机箱上的某个硬件有没有装,但是,因为客户那边机箱的倾斜度不固定,所以检测目标有可能会变形,他用视觉算法怎么写也不能保证百分百检测到,后来,我们公司一个刚刚学了视觉算法的程序员通过写硬代码,把问题给解决了!

打开网易新闻 查看精彩图片

这个所谓的机箱我不能说太明白,因为涉及到一些公司的敏感信息,但基本上和电脑机箱的结构差不多。

简单说下需求,我们需要检测的目标物有个特征,就是光照过去会反光。但是,要知道机箱里面的元器件很多,不仅仅只有这个元器件会反光,其他元器件也会反光。

因为机箱由工人搬上流水线的,所以放置的位置倾斜度是不固定的,所以摄像头拍出来的照片物体可能发生变形。

对于不懂机器视觉的同学,我解释下里面的逻辑。

其实我们就是通过工业相机拍照,然后对照片进行视觉算法处理,然后获取目标物的所在位置、尺寸、有、无等信息。

其中,标定位置其实就是事先给我们需要检测的目标划定一个大概的位置,这个位置其实就是工业相机拍出来的照片中,检测目标所在照片中的位置。

大牛的坚持

这个做机器视觉算法的大牛认为标定位置这个事情非常Low,所以,他采取的是检测形状和大小的方式。检测形状和大小的方式好处就是兼容性高,即使目标物体离得再远,只要能看清楚,通过形状判定和大小的比例关系就可以检测目标物的有和无。

但是,坏处也很显而易见,那就是当形状发生扭曲,那么就可能检测不上,而因为形状发生扭曲,大小也会跟之前的不一样。

这个做机器视觉的大牛始终无法写出一个能够兼容任何角度的视觉方案出来。

我曾经建议他使用笨一点的办法,那就是既然检测目标的位置是固定的,而且机箱摆放倾斜度不固定,所以使用形状和大小即使能做也需要费功夫,不如直接缩小检测范围,然后判定反光不就行了?

我的意思是可能有些人不明白,我稍微解释下!

机箱是个方形盒子,假设检测目标位于机箱的右上角,所占面积如果是机箱宽度的四分之一,高度也是四分之一,那么我们在检测目标时,首先将图片的检测范围固定在右上角的四分之一处。

这样做的好处就是首先缩小了检测范围,能够为视觉算法提升一定的工作效率,假设工业相机拍出来的照片是4000万像素的,那么通过我的方法,可以直接将目标像素缩小到1600万像素。

当然了,首先得确保检测目标一定是在这1600万像素的图片之内才行。

然后,既然我们无法用形状和面积检测目标物,那么通过目标物反光这个特性,我们可以直接取反光面积最大的那个地方来判断目标物(因为目标物的反光面积最大)。

而恰巧,那1600万像素的范围内,只有目标物是反光的,所以就可以更直接一点,只要检测到反光物,我们就可以认为已经检测到了目标物。

当然了,这里还是需要做一些基本的筛选,比如说反光面积最大的那块区域所占面积不得低于多少。因为只有目标物反光这只是简单的说法,不是说真的只有目标物反光,像一些小的螺丝钉其实也反光,只不过反光面积比较小,而且可能通过收缩(视觉词汇)无法百分百剔除。

这么一通操作下来,方法虽然笨,但很有效。

但是,这个视觉大牛驳斥了我的建议,并且说如果这么做可以,他早就这么做了。

他驳斥我的理由也很简单,其实也很有说服力,其实就是客户现场的不确定因素有很多,所以,只能通过已经确定的条件比如形状来做视觉检测。

比如他就问我:“万一哪天检测目标的位置发生了改变怎么办?目标物反光不明显怎么办?目标物旁边出现了一个和目标物大小一模一样的东西怎么办?”

这些我都无法回答,的确,如果真的出现了这样的问题,好像只有重写代码能解决!

所以,我就没有再跟大牛提过这个事情。

同事接管了大牛的代码

大牛的这个项目始终有问题也不是办法,后来,刚好我们公司对一些程序员进行了视觉相关知识的培训,主讲就是大牛。

因为我们公司的程序员基本上都是几个项目并行的,大牛去忙别的项目了,而那个机箱检测的项目客户又开始催优化了,于是大牛就让我们公司里面一个刚刚经过视觉培训的同事去负责这个项目。

大牛还跟那个同事说这个项目很简单,我听到大牛这么说,我在旁边都乐了,因为大家都知道这个项目大牛花了很长时间都没啃下来!

接手的这个同事当然也知道,我们曾经也讨论过这个事情,我还把我的方案说给他听过。

结果,这个同事接手大牛的这个项目以后,就啥也不管,完全按照我之前跟他说的思路来了一遍!

让人意外的是,经过这么一改,项目出奇的稳定!

大牛自然知道那个接手的程序员干了什么事,还跟客户说代码还需要再优化,客户连忙给他打住,说让他别优化了,就现在这样挺好,只要不出问题就这么着吧!

虽然这个项目最终还是埋了个坑,但是眼下的问题其实就是稳定,不打扰客户生产,未来的变数谁知道呢?

总结

我觉得这件事情中,大牛和我那个程序员同事其实都没错,但大牛太纠结于“兼容性”这件事情,但有时候写硬代码,的确是很有效的应对不可控因素的方法!

况且,从客户的反应来看,客户其实也觉得大牛这件事情托得有点久了,或许大牛的初衷就是为了考虑多种情况下的兼容性,但技术其实还是为业务服务的,大牛显然太执着于技术,对于业务不懂得变通!

当然了,如果这个事情最后是大牛通过算法解决了,那就是另一种说法了!只要能解决问题,那就是对的!