Java应用OpenvCV指南其六:利用OpenCV实现的数字识别(验证码识别)

  之前介绍了很多概念上的东西,这次让我们来进行一次实际的应用。数字识别可以应用在许多领域,如数字型验证码的识别,车牌识别等领域。下面借我之前完成的一个数字验证码识别的小项目来简单认识一下图象识别领域的知识。

  如果在阅读这篇文章时有什么疑问,可以参考一下之前的一些文章:

   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
这里是官网的解释,如果有兴趣的话可以在深入了解一下。

  不过相对于识别需要的内容,我们获得的原图一般都包含过多的图象信息,直接做二值化的话很难调参,即使勉强操作得出的图象也几乎无法进行识别,所以我们再二值化之

  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
要使用Python和OpenCV实现数字识别,可以按照以下步骤进行操作: 1. 收集数字样本图像并将其转换为灰度图像。 2. 将数字图像与预先训练的模型进行比较,以识别数字。 3. 对数字进行分类和识别,并输出结果。 以下是一个简单的数字识别的Python代码示例: ```python import cv2 import numpy as np # 加载训练集 digits = cv2.imread('digits.png',0) # 定义每个数字的大小和数量 rows = np.vsplit(digits,50) cells = [] for row in rows: row_cells = np.hsplit(row,50) for cell in row_cells: cells.append(cell) # 准备训练数据和标签 x = np.array(cells) train = x[:,:].reshape(-1,400).astype(np.float32) k = np.arange(10) train_labels = np.repeat(k,250)[:,np.newaxis] # 训练KNN模型 knn = cv2.ml.KNearest_create() knn.train(train, cv2.ml.ROW_SAMPLE, train_labels) # 加载测试图像 test_digits = cv2.imread('test_digits.png',0) test_cells = np.vsplit(test_digits,50) # 对每个测试图像进行识别 for i in range(len(test_cells)): test_row = test_cells[i] test_row_cells = np.hsplit(test_row,10) for j in range(len(test_row_cells)): test_cell = test_row_cells[j] test_cell = cv2.resize(test_cell,(20,20)) test_cell = np.array(test_cell,np.float32).reshape(-1,400) ret,result,neighbours,dist = knn.findNearest(test_cell,k=1) print(int(result[0][0]),end=' ') print() ``` 在这个示例中,我们首先加载数字图像,并将其拆分为单个数字图像。我们将这些数字图像用作训练数据,并使用KNN算法进行训练。然后,我们加载测试图像,并对每个数字图像进行识别,输出识别结果。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值