关于之前已经写过一篇文章了,是关于字符提取的与识别的,本篇文章与上次的文章内容大致一致,只是比对数据库变更了,并且不仅只通过轮廓,还可以通过模板图的方式来进行手写字提取!

函数介绍,以及轮廓提取和识别流程这里就不细说,详细的可以参考我的上一篇文章:使用Opencv进行轮廓检测,字符提取,简单的直方图字符识别!

首先比对要有数据库图,这里我们先手写几个字作为数据库模板

(JPG格式)

鼠标手写字有点不顺,写的有点丑,见笑了哈!

然后我们在手写两个字,注意必须是比对模板里有的

由于比对模板里只有中国两个手写字,所以这里就写上中国两个字:

下面开始上代码进行手写字比对

(代码具体讲解参考上一篇博客)

结构体:

typedef struct p_image{char c_name[256];CvHistogram *img_zft;
}p_image;

main代码:

//打开要识别的图像    IplImage *image = cvLoadImage("d:\\1.jpg");if (image == NULL){printf("错误:无法打开该图像文件!");}//转换到灰度图    IplImage *img_gray = cvCreateImage(cvGetSize(image), image->depth, 1);cvCvtColor(image, img_gray, CV_BGR2GRAY);//二值化    IplImage *img_value = cvCreateImage(cvGetSize(img_gray), image->depth, 1);cvThreshold(img_gray, img_value, 100, 255, CV_THRESH_BINARY_INV);//寻找轮廓    CvMemStorage *pStorage = cvCreateMemStorage(0);CvSeq *pConInner = NULL;int num = cvFindContours(img_value, pStorage, &pConInner, sizeof(CvContour),CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);IplImage* imgNo[9] = { NULL };IplImage *i1[9] = { NULL };//手写字提取    for (int i = 0; i < num; i++){CvRect rc = cvBoundingRect(pConInner);//cvDrawRect(image, cvPoint(rc.x, rc.y), cvPoint(rc.x + rc.width, rc.y + rc.height), CV_RGB(255, 0, 0));    //为了防止裁剪时出现矩阵颜色,所以将这段代码屏蔽掉!    imgNo[i] = cvCreateImage(cvSize(rc.width, rc.height), IPL_DEPTH_8U, 3);cvSetImageROI(image, cvRect(rc.x, rc.y, rc.width, rc.height));//设置源图像ROI    cvCopy(image, imgNo[i]);    //裁剪    pConInner = pConInner->h_next;}//将获取到的手写字保存起来,在读取出来,分别存储到对应的模板img文件夹里//保存与读取      char name[256];for (int i = 0; i < num; ++i){sprintf(name, "d:\\img\\%d.jpg", i);cvSaveImage(name, imgNo[i]);}char b[256];for (int i = 0; i < num; ++i){sprintf(b, "d:\\img\\%d.jpg", i);imgNo[i] = cvLoadImage(b);}//灰度转换    for (int i = 0; i < num; ++i){i1[i] = cvCreateImage(cvSize(imgNo[i]->width, imgNo[i]->height), 8, 1);cvCvtColor(imgNo[i], i1[i], CV_BGR2GRAY);//CV_BGR2GRAY      }//计算原图的直方图    int arr_size = 255;                 //定义一个变量用于表示直方图行宽      float hranges_arr[] = { 0, 255 };       //图像方块范围数组      float *phranges_arr = hranges_arr;      //cvCreateHist参数是一个二级指针,所以要用指针指向数组然后传参      //创建直方图      CvHistogram *hist[9];for (int i = 0; i < num; ++i){hist[i] = cvCreateHist(1, &arr_size, CV_HIST_ARRAY, &phranges_arr, 1);//创建一个一维的直方图,行宽为255,多维密集数组,方块范围为0-255,bin均化      }//计算直方图    for (int i = 0; i < num; ++i){cvCalcHist(&i1[i], hist[i], 0, 0);}//手写字与图像关联    //加载模板图,图像存放在d盘img1文件夹中   IplImage* abcd_img[9] = { NULL };char img_name[256] = { 0 };for (int i = 0; i < num; ++i){sprintf(img_name, "d:\\img1\\%d.jpg", i);abcd_img[i] = cvLoadImage(img_name);}//转换灰度图    IplImage* abcd_img_hdt[9] = { NULL };for (int i = 0; i < num; ++i){abcd_img_hdt[i] = cvCreateImage(cvSize(abcd_img[i]->width, abcd_img[i]->height), 8, 1);cvCvtColor(abcd_img[i], abcd_img_hdt[i], CV_BGR2GRAY);//CV_BGR2GRAY      }//创建直方图      CvHistogram *hist_abcd[9];for (int i = 0; i < num; ++i){hist_abcd[i] = cvCreateHist(1, &arr_size, CV_HIST_ARRAY, &phranges_arr, 1);//创建一个一维的直方图,行宽为255,多维密集数组,方块范围为0-255,bin均化      }//计算模板图的直方图    for (int i = 0; i < num; ++i){cvCalcHist(&abcd_img_hdt[i], hist_abcd[i], 0, 0);}//关联图像    p_image *p[9] = { NULL };for (int i = 0; i <= num; ++i){p[i] = (p_image *)malloc(sizeof(p_image));}//手写字关联    char abcd[9][256] = { "中", "国"};    //定义一个二维字符数组,9行,每行256列(256个数据)for (int i = 0; i <= num; ++i){strcpy(p[i]->c_name,abcd[i]);}//直方图关联    for (int i = 0; i < num; ++i){p[i]->img_zft = hist_abcd[i];}//匹配图像    //用于结果    char j_c[9][256];for (int j = 0; j < num; ++j){double Compare = cvCompareHist(hist[j], p[j]->img_zft, 0);     //使用CV_COMP_CORREL方法进行对比    if (Compare >= 0.9){ //精准度达90%strcpy(j_c[j], p[j]->c_name);}}printf("检测到%d个手写字,分别是:\n", num);for (int i = 0; i < num; ++i){printf("%s\n", j_c[i]);}getchar();

运行结果:

注意前面说过,直方图是利用图像中明暗程度进行比较的,像这种黑白图,白就代表明,黑就代表暗,所以识别起来重叠几率较高,不建议使用模板比对,建议使用其他方法进行比对!

基于Opencv的手写字识别相关推荐

  1. 毕业设计-基于机器视觉的手写字识别系统

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言

  2. 基于tensorflow的MNIST手写字识别

    一.卷积神经网络模型知识要点卷积卷积 1.卷积 2.池化 3.全连接 4.梯度下降法 5.softmax 本次就是用最简单的方法给大家讲解这些概念,因为具体的各种论文网上都有,连推导都有,所以本文主要 ...

  3. TensorFlow基于minist数据集实现手写字识别实战的三个模型

    手写字识别 model1:输入层→全连接→输出层softmax model2:输入层→全连接→隐含层→全连接→输出层softmax model3:输入层→卷积层1→卷积层2→全连接→dropout层→ ...

  4. 用TensorFlow教你手写字识别

    1.MNIST数据集 基于MNIST数据集实现手写字识别可谓是深度学习经典入门必会的技能,该数据集由60000张训练图片和10000张测试图片组成,每张均为28*28像素的黑白图片.关于数据集的获取, ...

  5. 利用卷积神经网络实现手写字识别

    本文我们介绍一下卷积神经网络,然后基于pytorch实现一个卷积神经网络,并实现手写字识别 卷积神经网络介绍 传统神经网络处理图片问题的不足 让我们先复习一下神经网络的工作流程: 搭建一个神经网络 将 ...

  6. python手写汉字识别_TensorFlow 2.0实践之中文手写字识别

    问题导读: 1.相比于简单minist识别,汉字识别具有哪些难点? 2.如何快速的构建一个OCR网络模型? 3.读取的时候有哪些点需要注意? 4.如何让模型更简单的收敛? 还在玩minist?fash ...

  7. .net 数字转汉字_TensorFlow 2.0 中文手写字识别(汉字OCR)

    TensorFlow 2.0 中文手写字识别(汉字OCR) 在开始之前,必须要说明的是,本教程完全基于TensorFlow2.0 接口编写,请误与其他古老的教程混为一谈,本教程除了手把手教大家完成这个 ...

  8. 利用神经网络实现手写字识别

    神经网络介绍 神经网络即多层感知机 如果不知道感知机的可以看博主之前的文章感知机及Python实现 神经网络实现及手写字识别 关于数据集: 从http://yann.lecun.com/exdb/mn ...

  9. 数字识别java开源_Java基于opencv实现图像数字识别(三)—灰度化和二值化

    Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...

最新文章

  1. Redis缓存使用技巧
  2. 标注工具_语料标注工具(2)
  3. python中显示第三行数据_Python从零开始第三章数据处理与分析①python中的dplyr(1)...
  4. 抓包写代码模拟怎么减少重复劳动
  5. junit 静态方法_预期异常规则和模拟静态方法– JUnit
  6. php-5.2.6安装,php5.2.6安装openssl.o扩展,make时报错?
  7. 同一台电脑安装python2python3
  8. 【NOIP2013】【Luogu1983】车站分级(建图,拓扑排序)
  9. 计算机专业中英文,计算机专业词汇中英文对照
  10. div 一段时间后自动隐藏
  11. Qt笔记8--zlib实现gzip解压
  12. 2022年 hust OJ 最新搭建方式
  13. strip符号和节移除工具,符号表删除
  14. 订单操作-订单详情查询代码实现
  15. 从韩春雨事件看学术成果的辨别
  16. yolov3损失函数分析
  17. CTA 认证android平台 彩信/ MMS 受控原理
  18. 第一章,实现数据完整性
  19. 用FineReport报表系统构建资金监管平台
  20. 真 · 神经网络发明人福岛邦彦获奖,Schmidhuber、李飞飞点赞

热门文章

  1. mybatis 不生效 参数_Spring Boot(七):你不能不知道的Mybatis缓存机制
  2. nginx强制刷新用户缓存_HTTP 缓存
  3. 小米8android版本打开,怎么查看小米手机安卓系统版本
  4. 计算机装配调试员培训内容.doc,电子计算机(微机)装配调试员文档.doc
  5. ubuntu mysql下载64位下载_ubuntu mysql下载|
  6. 表单提交_django 的ajax提交与表单提交记录
  7. 集群oracle实例扩sga,oracle管理基础知识
  8. 系统与服务器断开了连接不上,win7系统电脑玩跑跑卡丁车出现与服务器断开连接的解决方法...
  9. 光复用技术中三种重要技术_【技术文章】X射线无损检测仪在锂电池行业中的重要应用...
  10. 学python还有机会吗_此时此刻,拥有一套全方面学习Python的机会是怎样一种体验?...