使用C++结合Opencv库实现简易汉字识别。

文章目录

  • Opencv实现汉字识别
    • 程序实现思路
      • 图像预处理
        • 思路
        • 实现实例
      • 对比方法
      • 模型训练
      • 识别过程
    • 特殊参数
    • 使用说明
      • 模型训练
      • 模型导入
      • 汉字识别
    • 程序使用结果
    • 不足以及思考

Opencv实现汉字识别

程序实现思路

图像预处理

导入图像进行一系列预处理,使其便于用来识别和其他计算。

思路

  • 灰度化

    • 使用opencv的库函数来实现。

      cv::cvtColor(image, image_gray, CV_BGR2GRAY);

  • 二值化

    • 同样选用库函数来实现,本例使用的是自适应二值化函数。

      cv::adaptiveThreshold(image_gray, image_value, 255, 0, 1, 5, 10);

  • 降噪(去除干扰线)

    • 实现的思路并非去除干扰线,而是尽量不把干扰线选中到识别区域。

    • 先通过腐蚀,使较细的干扰线消去。

      erode(image_value, temp, kernel2);

    • 再通过膨胀,使汉字主体明显。

      dilate(temp, dst, kernel1);

  • 轮廓识别

    • 使用库函数找出外轮廓点集。

      findContours(dst, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point());

  • 最小矩阵

    • 使用库函数找出包含轮廓点集的最小矩形。将其画出。
  • 汉字分割

    • 将矩阵框出的部分,复制到新的Mat数组中。

实现实例

准备一张用于当作模型的图片。

灰度化

本身就只有大部分为黑白色,故灰度化结果不明显。

二值化

腐蚀

可以发现干扰线已经基本看不见了,但是汉字好似被断裂开。不利于后面的寻找轮廓,故进行膨胀操作。

膨胀

膨胀有两个目的:一是使腐蚀后断裂的文字合起来。二是使某些上下结构或左右结构明显的字合起来。否则在识别(吴)的区域时,容易将(口)(天)分别框出,不利于识别整体的汉字。

最小矩阵

在膨胀后的基础上,寻找轮廓,并找出轮廓的最小矩阵。

切割后保存

框出文字的矩阵只在测试时画出,实际裁剪保存的时候,并不绘制出矩阵,是为了排除矩阵的存在对识别精确度的影响。

分割后保存的模板

对比方法

本例使用直方图匹配的方式,此方式的精确度实际并不高。其他如卷积神经网络难度较大,暂时没有足够的时间研究。故采用此种方法。

主要是将c。三者关系一一对应。找出与识别对象的直方图数据匹配图最高的模板图像,就可以确定其文字。

模型训练

模板图像——直方图数据——汉字

采用结构体。

struct pimage {char c_name[3];Mat img_zft;
};

从模板数据库中,读取每张文字对应的图片。将其灰度化后,计算直方图数据。

本例的数据都没有采用写入到文件的方式保存,故每次运行前都要导入一次模型,用于计算这些数据。

数据关联

for (i = 0; i < num; i++) {//直方图计算calcHist(&imgNo_gray[i], 1,&channels ,Mat(), hist[i], 1, &histSize,&phranges_arr);strcpy_s(p_imgNo[i].c_name, img_word[i]);//手写字关联 p_imgNo[i].img_zft = hist[i];//直方图关联}

识别过程

完成上面的模型制作,以及数据关联后。就可以进行识别过程了。

先进行预处理过程,再同样计算直方图。和模型数据进行对比。

double Compare,compare;
int word = 0;
for (int j = 0; j < contours.size()-1; j++) {if (contours[j].size() < 10) { word++; continue; }compare = 0;for (int k = 0; k < num; k++) {//使用CV_COMP_CORREL方法进行对比    Compare = compareHist(hist1[j], p_imgNo[k].img_zft, 0);    //精准度达90%if (Compare >= 0.9) {if (compare > Compare) { continue; }else {compare = Compare;strcpy_s(p_img[j].c_name, p_imgNo[k].c_name);}}}}//识别完成,输出结果printf_s("检测到%d个文字,分别是\n",contours.size()-word);for (int i = 0; i < contours.size(); ++i) {cout << p_img[i].c_name;}

特殊参数

constexpr auto img_data = "E:/img";           //模板图像存储路径
#define num 77                              //模板汉字个数

使用说明

模型训练

​ 若已有模板图的文件则无需进行训练。

​ 操作:根据提示输入2和训练模型所用的图片。

结果:会在默认的模型保存路径存有模型图片下的每个汉字的切割图。

需要自己手动操作。
img_word[]数组内,按下标顺序依次输入所对应的汉字。

模型导入

就是结构体内数据依次计算,存入的过程。

汉字识别

识别的图像最好是模板图或者其截图的一部分。这是由于使用直方图匹配,重复的概率太大所导致的。

根据提示操作即可。

程序使用结果

可以发现识别的准确率还是很高的。

不足以及思考

  1. 由于没有将数据保存在外部,故每次使用前都必须进行依次导入模板的操作。
  2. 只有一个main函数,可以将预处理封装起来。减少代码量。
  3. 使用的识别算法准确率还不够高,只能识别模板图罢了。还不能应用到各种手写体。
  4. 对于部分可能出现的错误操作,也还没有编写足够的错误提示。

思路就是这样,源码也有。
源码

基于Opencv实现的简易汉字识别相关推荐

  1. java opencv bp网_基于Opencv自带BP网络的车标简易识别

    记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果 1.准备工作 1.1 训练集和测试集准备 先将数据集手动划分成训练集和测试集,并分好类,比如第一类就放在文件夹名为0的文件夹下, ...

  2. 基于OpenCV的简易实时手势识别(含代码)

    基于OpenCV的简易实时手势识别 1.基本信息介绍 1.1实验步骤 1.2效果展示 2.肤色检测+二值化+开运算+高斯模糊 2.1 flip()函数原型 2.2cvtColor()函数原型 2.3s ...

  3. 基于Opencv自带BP网络的车标简易识别

    代码地址如下: http://www.demodashi.com/demo/12966.html 记得把这几点描述好咯:代码实现过程 + 项目文件结构截图 + 演示效果 1.准备工作 1.1 训练集和 ...

  4. 一组基于OpenCV的图像处理函数

    本文在根据 Getting Started with OpenCV 给出的对于OpenCV使用介绍进行整理,以备之后的学习和工程应用.   下面给出了一系列的对于小白应用OpenCV进行初步指导的博文 ...

  5. 图像工程课程设计 基于 OpenCV 、 Qt 库实现的图像处理软件 大学编程作业(TUST 天津科技大学 2023年)

    基于 OpenCV . Qt 库实现的图像处理软件 目录 基于 OpenCV . Qt 库实现的图像处理软件 一.项目简介 二.项目要求 三.项目源码 四.交流学习 图像处理工具说明文档 基于 Ope ...

  6. Python基于opencv “三维”旋转图片,解决日常小问题

    背景 前段时间因为要办理一些事情,需要家里人拍 户口本首页 和 个人所在页的照片用来打印,家里父亲已经年过六旬,能学会玩微信已经实属不易,让父亲用手机拍出很正的图片有点太难,户口本首页拍了有5张以上, ...

  7. 语义分割:基于openCV和深度学习(二)

    语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...

  8. 语义分割:基于openCV和深度学习(一)

    语义分割:基于openCV和深度学习(一) Semantic segmentation with OpenCV and deep learning 介绍如何使用OpenCV.深度学习和ENet架构执行 ...

  9. 《OpenCV3编程入门》学习笔记7 图像变换(一)基于OpenCV的边缘检测

    第7章 图像变换 7.1 基于OpenCV的边缘检测 7.1.1 边缘检测的一般步骤 1.滤波:边缘检测算法主要基于图像强度的一阶和二阶导数,导数对噪声敏感,所以要滤波 2.增强:确定图像各点邻域强度 ...

  10. 基于OpenCV的图像梯度与边缘检测!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:姚童,Datawhale优秀学习者,华北电力大学 严格的说,梯度计 ...

最新文章

  1. Blockchain与Big Data将碰撞出怎样的火花?
  2. IOS上微信在输入框弹出键盘后,页面不恢复,下方有留白,有弹窗弹出时页面内容感应区域错位...
  3. xcode 写代码没有补全 提示
  4. $\mathfrak {reputation}$
  5. docker 删除image_如何用两个小时入门 Docker?
  6. 求解最长回文子串----Manacher 算法
  7. Java任务完成后结算_Java执行程序:如何在任务完成时无阻碍地得到通知?
  8. Docker核心技术与实现原理
  9. C#基础知识回顾整理
  10. C++中引用变量的探究
  11. 信息流广告投放分析实战案例!
  12. 数据库的基本结构三个层次
  13. Python精讲:Python中集合的概念和创建方法详解
  14. p2p与反p2p的博弈,一劳永逸真的不容易么
  15. 怎么搭配丝袜优雅不低俗?
  16. 电话机漏电流大引起电话交换机振铃
  17. chrome无法添加.crx文件(扩展程序)
  18. 基于FFmpeg的视频播放器之十三:抓图
  19. 超全!传感器最强科普总结(收藏版)-道合顺大数据infinigo
  20. 根据文件模板实现预览、生成word、pdf、excel(后端-项目)

热门文章

  1. 使用python显示图像在windows图片查看器中一直显示加载中就是打不开的解决途径
  2. ps制作动态html,PS制作动态海报教程
  3. ORA-00932:数据类型不一致,应为-,但却获得BLOB类型
  4. 数据库原理及应用-李唯唯主编-实验3-3
  5. Java关于数字的正则校验
  6. github上springcloud 项目框架的前后端的启动(2021-08-05)
  7. LaTeX插入参考文献并引用
  8. FID - Web特征数据来了
  9. 按键消抖(并联0.1uf电容)
  10. 科学-建筑学:建筑学百科