之前介绍了很多概念上的东西,这次让我们来进行一次实际的应用。数字识别可以应用在许多领域,如数字型验证码的识别,车牌识别等领域。下面借我之前完成的一个数字验证码识别的小项目来简单认识一下图象识别领域的知识。
如果在阅读这篇文章时有什么疑问,可以参考一下之前的一些文章:
Java应用OpenCV指南其一:在Java中安装与配置OpenCV
Java应用OpenCV指南其二:OpenCV组件浅析
Java应用OpenCV指南其三:OpenCV中的图像操作
Java应用OpenCV指南其四:OpenCV获取ROI区域、图像叠加
Java应用OpenCV指南其五:图象滤波
一、数字识别流程
1、图象预处理
图像预处理,是将待检测图像交给识别模块识别。在图像分析中,对输入图像进行特征提取、分割和匹配前所进行的必要处理。
图像预处理的主要目的是消除图像中无关的信息,恢复有用的真实信息,增强有关信息的可检测性和最大限度地简化数据,从而提高特征抽取、图像分割、匹配和识别的可靠性。
在识别数字的时候,预处理的最终目标一般都是生成一张原图的清晰二值化图象,所谓二值化就是将要识别的图像变成只有黑白两种颜色的单通道图片。经过这样处理后的图像特征突出,颜色简单,可以大大的降低我们识别时的难度和复杂度。
二值化函数:
Imgproc.threshold(src, dst, thresh, maxval, type);
• 第一个参数,Mat型的src为待处理的原图。
• 第二个参数,Mat型的dst为输出的图象。
• 第三个参数为阈值。
• 第四个参数表示最大值。
• 第五个参数表示二值运算的方式,参数数值说明如下:
enum
{
CV_THRESH_BINARY =0, /* value = value > threshold ? max_value : 0 */
CV_THRESH_BINARY_INV =1, /* value = value > threshold ? 0 : max_value */
CV_THRESH_TRUNC =2, /* value = value > threshold ? threshold : value */
CV_THRESH_TOZERO =3, /* value = value > threshold ? value : 0 */
CV_THRESH_TOZERO_INV =4, /* value = value > threshold ? 0 : value */
CV_THRESH_MASK =7,
CV_THRESH_OTSU =8 /* use Otsu algorithm to choose the optimal threshold value; combine the flag with one of the above CV_THRESH_* values */
};
上面是不同方式的注释。
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/threshold/threshold.html
这里是官网的解释,如果有兴趣的话可以在深入了解一下。
不过相对于识别需要的内容,我们获得的原图一般都包含过多的图象信息,直接做二值化的话很难调参,即使勉强操作得出的图象也几乎无法进行识别,所以我们再二值化之