传统视觉算法要解决的两大问题:
程序员如何找到合适的判定条件(思维和经验)
如何让这些判定条件体现在图像或者数值上(图像处理和合适的算法),以便让机器识别
前者决定着后者,你对目标有什么样的认识,认识的深度如何,都会决定你处理图像使用的手段(函数) 也就是说,程序员的水平很大程度上体现在代码的思路上
-
目标有哪些属性或特征,能否通过检测这些特征来识别目标
-
颜色(也就是图像矩阵的值,包括但不限于色相饱和度亮度等等)
-
形状
-
位置(非优先考虑)
-
上面三者的组合
-
-
如果想到了有多种方法,如何择优?换句话说,应当设计什么样的解决方案?
-
要处理的数据量尽量小(比如筛选直线和筛选点,应该选择筛选点,因为两点一线
通常要选取维度高的处理手段,比如处理一个图像上的矩形,最好采用轮廓检测或椭圆拟合,而不是用霍夫变换检测出很多个结果,而且调参数还麻烦
-
算法要足够简单易懂明了,复杂的算法往往具有更弱的鲁棒性和泛用性
-
-
我要检测的目标会同时出现几个,如果多个,会干扰我对目标的正常检测么
-
选定的检测判据是否收到其他因素的干扰(比如我要检测靶子上的灯条,地面反光和机身灯的干扰)
-
若果有,则换一个判据或者将判定条件更细化(分而治之,缩小范围,直至得解)
-
-
细化到一定程度就能够知道用什么样的手段来处理图像,前提是你对OpenCV中含有的工具和数据结构足够熟悉,否则基本知识的贫乏会反过来限制你的想象思维
总结起来就是,你懂目标,懂工具怎么用,计算机就懂你