上学时候用matlab学过一些图像处理的基础知识,当时课程作业是用haar实现人脸检测
but当时是心思根本不在图像处理上,so找了个同学帮忙做的,自己没上心
然鹅天道好轮回,现在捡起来了原来的算法一脸懵逼,自己挖的坑再深也得跳下去啊!
先上一张经典的lena图镇场子!
流程图:
读取一张图片→转灰度图→人眼/人脸检测→标识出来→显示/保存结果
其中,重中之重就是怎样进行检测?下面主要讲一下openCV中现成的一种算法——Haar
算法详解请参考https://blog.csdn.net/playezio/article/details/80471000
如果看不懂很正常,这里用到了太多的数学、图像处理的相关知识,要补的知识点实在是太多太多了!
简单一句话来说:用一个“特征集”去“滑动”匹配待检测的图片,如果图片中某个部分“符合”要求则会标记出来
特征集是个啥?
可以用openCV里封装好的,比如人脸的特征集合(具体是什么我也没有看懂内部算法……)、还有其他的比如eye、body、汽车等等,这些是openCV里已经写好的,具有普适性可以供大家直接调用;
当然也可以自己建立,比如你想建立一个鼠标的特征集等等,难度较大
滑动?还摩擦摩擦呢……
如果特征集是个10*10的窗口,待检测图片是100*100的大小,那么这个小窗口会在图片上从上到下,从左到右,步长为1(顺序和步长不确定,只是推测是这么进行的)进行匹配,这称为滑动窗口技术(sliding window)
在此条件下,遍历一张图片所需要的匹配次数是(100/10*1)*(100/10*1)=100次
“金字塔流程”——不是埃及辣个
如果有个10*10的眼睛的特征集,待检测图片是一张100*100的大头照,一只眼睛的部分可能占了50*50(比例肯定不对,领会一下精神),那么用这个小窗口怎么匹配都匹配不到啊,怎么办?
把图片缩小到原来的五分之一或者把特征集扩大到5倍不就好了嘛!
在算法中是一点一点试验这个缩放倍数的,就如同金字塔横切面一样。因此从默认的窗口遍历一遍不够,因此最终结果比100次要大的多,这个缩放倍数越小,计算量越大
符合要求?这里不展开讲解了,太难!总之一旦符合,就会被标记出来,因此一幅图中如果只有一张脸,但是周围可能会有很多标记的方框(滑动窗口技术和金字塔流程共同导致的)以及可能看起来像人脸的部分,如下图:
(测试结果不是我做的,网上找的)
但是我们想要的结果就是标记出来两张脸就好了,该合并的就合并,该抛弃的就抛弃(所以说人还是要比机