图像处理——OpenCV学习(1.7~1.9)
一、人脸识别程序剖析
下面就图片预处理、级联分类器这两大块进行分析:
1) 图片预处理流程
基于人脸识别的代码进行分步解析。
Mat gray;
cvtColor(img, gray, CV_RGB2GRAY); //①转换成灰度图
equalizeHist(gray, gray); //②直方图均衡化
ccf.detectMultiScale(gray, faces, 1.1, 3, 0, Size(10, 10), Size(100, 100)); //③检测人脸
①如下为将原图像转换成灰度图的效果,因为Haar特征是从灰度图中读取的
②如下为将原图像直方图均衡化的效果,这一步是通过拉伸各个像素分布来实现图像增强。
③最后一步,人脸检测并显示结果
2)级联分类器原理
程序中用到了OPENCV自带的级联分类器,CascadeClassifier,来检测图片或视频流中的目标——人脸(视频中多一个人眼)。所以接下来就浅谈一下这个级联分类器。
首先,Haar分类器 = Harr-like特征 + 积分图方法 + Adaboost算法 + 级联。
① 使用Haar-like特征做检测。
② 使用积分图(Integral Image)对Haar-like特征求值进行加速。
③ 使用AdaBoost算法训练区分人脸和非人脸的强分类器。
④ 使用筛选式级联把强分类器级联到一起,提高准确率。
值得一提的是其中的Haar-like特征检测,下面做较详细的分析。
二、Haar特征
前面所讲的AdaBoost算法的实现,采用的是输入图像的矩形特征,也叫Haar特征。影响Adaboost检测训练算法速度很重要的两方面是特征的选取和特征值的计算。人脸的一些特征可以由矩形特征简单地描绘。如下图,特征值的定义为白色矩形像素和减去黑色矩形像素和,根据特征值判断出人脸样本和非人脸样本。
为了找出这些特征和计算出所需的特征值,首先,我们要在图片中划分出满足特定条件的矩形,即条件矩形,其中的条件称为(s,t)条件。(s,t)条件有两个内容
(1)x轴方向边长必须能被自然数s 整除(能均等分成s 段);
(2)y 轴方向边长必须能被自然数t 整除(能均等分成t 段);
所以矩形的最小尺寸为s×t或者t×s, 最大尺寸为[m/s]·s×[m/t]·t 或[m/t]·t×[m/s]·s;其中[ ]为取整运算符。这在利用该函数时需要用到
找出条件矩形后,计算其特征值,
对于理想的像素值随机分布的图像来说,同一个矩形特征对不同图像的特征值的平均值应该趋于一个定值k。
在对输入图像进行检测的时候,一般输入图像都是很大的。在Adaboost 算法中采用了扩大检测窗口的方法,而不是缩小图片。在检测的最初,检测窗口和样本大小一致,然后按照一定的尺度参数(即每次移动的像素个数,向左然后向下)进行移动,遍历整个图像,标出可能的人脸区域。遍历完以后按照指定的放大的倍数参数放大检测窗口,然后在进行一次图像遍历;这样不停的放大检测窗口对检测图像进行遍历,直到检测窗口超过原图像的一半以后停止遍历。在检测窗口遍历完一次图像后,处理重叠的检测到的人脸区域,进行合并等操作。
三、车牌识别进展
整个车牌识别过程实际上相当于包含了两个过程:1,是车牌的识别;2,车牌字符的识别。由于工程较大及陌生的部分较多,目前只对前一个过程进行了分析。以下为所得:
1、大致流程及运行截图如下
1)准备
转换图片格式至HSV,取S通道图像,再转化为灰度图。
2)检测
利用opencv中自带的MSER函数,分别进行MSER+与MSER-检测,再进行闭操作连接缝隙,寻找外部轮廓。
3)输出
根据最终保存区域,设置矩形大小,截出车牌区域并输出图像。
四、总结
通过学习人脸识别/车牌识别来提升自己在图像识别方面的工程经验是非常好的,因为它非常好的说明了计算机视觉的一般过程:
图像→→预处理→→图像分析→→目标提取→→目标识别。
而学到现在,我们的感觉就是:要学的东西还很多,网上的资源也非常丰富,剩下的就只是一步步地走下去了。相信付出都是有回报的,走过的路都不会白走。