人工智能是当下很热门的话题,手写识别是一个典型的应用。为了进一步了解这个领域,我阅读了大量的论文,并借助opencv完成了对28x28的数字图片(预处理后的二值图像)的识别任务。

预处理一张图片:

首先采用opencv读取图片的构造函数读取灰度的图片,再采用大津法求出图片的二值化的阈值,并且将图片二值化。

int otsu(const IplImage* src_image) {

double sum = 0.0;

double w0 = 0.0;

double w1 = 0.0;

double u0_temp = 0.0;

double u1_temp = 0.0;

double u0 = 0.0;

double u1 = 0.0;

double delta_temp = 0.0;

double delta_max = 0.0;

int pixel_count[] = { };

float pixel_pro[] = { };

int threshold = ;

uchar* data = (uchar*)src_image->imageData;

for (int i = ; i < src_image->height; i++) {

for (int j = ; j < src_image->width; j++) {

pixel_count[(int)data[i * src_image->width + j]]++;

sum += (int)data[i * src_image->width + j];

}

}

for (int i = ; i < ; i++) {

pixel_pro[i] = (float)pixel_count[i] / (src_image->height * src_image->width);

}

for (int i = ; i < ; i++) {

w0 = w1 = u0_temp = u1_temp = u0 = u1 = delta_temp = ;

for (int j = ; j < ; j++) {

if (j <= i) {

w0 += pixel_pro[j];

u0_temp += j * pixel_pro[j];

}

else {

w1 += pixel_pro[j];

u1_temp += j * pixel_pro[j];

}

}

u0 = u0_temp / w0;

u1 = u1_temp / w1;

delta_temp = (float)(w0 *w1* pow((u0 - u1), ));

if (delta_temp > delta_max) {

delta_max = delta_temp;

threshold = i;

}

}

return threshold;

}

大津法

void imageBinarization(IplImage* src_image) {

IplImage* binImg = cvCreateImage(cvGetSize(src_image), src_image->depth, src_image->nChannels);

CvScalar s;

int ave = ;

int binThreshold = otsu(src_image);

for (int i = ; i < src_image->height; i++) {

for (int j = ; j < src_image->width; j++) {

s = cvGet2D(src_image, i, j);

ave = (s.val[] + s.val[] + s.val[]) / ;

if (ave < binThreshold) {

s.val[] = s.val[] = s.val[] = 0xff;

cvSet2D(src_image, i, j, s);

}

else {

s.val[] = s.val[] = s.val[] = 0x00;

cvSet2D(src_image, i, j, s);

}

}

}

cvCopy(src_image, binImg);

cvSaveImage(bined, binImg);

//cvShowImage("binarization", binImg);

//waitKey(0);

}

二值化

由于是只进行简单的识别模拟,因此没有做像素断点的处理。获取minst提供的数据集,提取每个图片的hog特征,参数如下:

HOGDescriptor *hog = new HOGDescriptor(

cvSize(ImgWidht, ImgHeight), cvSize(, ), cvSize(, ), cvSize(, ), );

(9个方向换成18个可能会取得更准确的结果,这取决于对图片本身的复杂程度的分析

之后即可训练knn分类器,进行分类了。

void knnTrain() {

#ifdef SAVETRAINED

//knn training;

samples.clear();

dat_mat = Mat::zeros( * nImgNum, , CV_32FC1);

res_mat = Mat::zeros( * nImgNum, , CV_32FC1);

for (int i = ; i != ; i++) {

getFile(dirNames[i], i);

}

preTrain();

cout << "------ Training finished. -----" << endl << endl;

knn.train(dat_mat, res_mat, Mat(), false, );

#ifdef SAVEASXML

knn.save("./trained/knnTrained.xml");

#endif

#else

knn.load("./trained/knnTrained.xml");

#endif

//knn test

cout << endl << "--- KNN test mode : ---" << endl;

int tCnt = ;

int tAc = ;

selfknnTest(tCnt, tAc);

cout << endl << endl << "Total number of test samples : " << tCnt << endl;

cout << "Accuracy : " << float(float(tAc) / float(tCnt)) * << "%" << endl;

}

train

训练结果如下,准确率还是很令人满意的。

OpenCV&plus;TensorFlow图片手写数字识别&lpar;附源码&rpar;

初次接触TensorFlow,而手写数字训练识别是其最基本的入门教程,网上关于训练的教程很多,但是模型的测试大多都是官方提供的一些素材,能不能自己随便写一串数字让机器识别出来呢?纸上得来终觉浅,带着这 ...

机器学习(二)-kNN手写数字识别

一.kNN算法是机器学习的入门算法,其中不涉及训练,主要思想是计算待测点和参照点的距离,选取距离较近的参照点的类别作为待测点的的类别. 1,距离可以是欧式距离,夹角余弦距离等等. 2,k值不能选择太大 ...

kaggle 实战 (1)&colon; PCA &plus; KNN 手写数字识别

文章目录 加载package read data PCA 降维探索 选择50维度, 拆分数据为训练集,测试机 KNN PCA降维和K值筛选 分析k & 维度 vs 精度 预测 生成提交文件 本 ...

用Keras搭建神经网络 简单模版(三)—— CNN 卷积神经网络(手写数字图片识别)

# -*- coding: utf-8 -*- import numpy as np np.random.seed(1337) #for reproducibility再现性 from keras.d ...

10,knn手写数字识别

# 导包 import numpy as np import matplotlib.pyplot as plt from sklearn.neighbors import KNeighborsClas ...

KNN手写数字识别

import numpy as np import matplotlib .pyplot as plt from sklearn.neighbors import KNeighborsClassifi ...

caffe&plus;opencv3&period;3dnn模块 完成手写数字图片识别

最近由于项目需要用到caffe,学习了下caffe的用法,在使用过程中也是遇到了些问题,通过上网搜索和问老师的方法解决了,在此记录下过程,方便以后查看,也希望能为和我一样的新手们提供帮助. 顺带附上老 ...

用tensorflow求手写数字的识别准确率 (简单版)

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #载入数据集 mnist = in ...

吴裕雄 python神经网络 手写数字图片识别(5)

import kerasimport matplotlib.pyplot as pltfrom keras.models import Sequentialfrom keras.layers impo ...

随机推荐

Pyhton的发展历程

Python的由来 在1989年12月时,吉多·范罗苏姆——龟叔,想寻找一门“课余”编程项目来打发圣诞节前后的时间.Guido决定为当时正构思的一个新的脚本语言写一个解释器,它是ABC语言(教学语言. ...

HDU 5050

http://acm.hdu.edu.cn/showproblem.php?pid=5050 大数gcd import java.io.* ; import java.math.* ; import ...

Linux下文件的压缩和解压

tar命令 解包:tar zxvf FileName.tar 打包:tar czvf FileName.tar DirName gz命令 解压1:gunzip FileName.gz 解压2:gzip ...

sort&lpar;&rpar; 方法用于对数组的元素进行排序

语法 arrayObject.sort(sortby) 参数 描述 sortby 可选.规定排序顺序.必须是函数. 返回值 对数组的引用.请注意,数组在原数组上进行排序,不生成副本. 说明 如果调用该 ...

Random类&lpar;java&period;util&rpar;

转自 Random类中实现的随机算法是伪随机,也就是有规则的随机.在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字. 相同种子数的Rand ...

LaTeX 中插入数学公式

一.常用的数学符号 1.小写希腊字母 \alpha \nu \beta \xi \gamma o \delta \pi \epsilon \rho \zeta \sigma \eta \tau \th ...

【Spring 核心】高级装配

高级装配用来适应开发和生产 不同环境下的软切换 一.环境与profile 1.开发环境下的profile package com.bonc.config; import javax.sql.DataS ...

Intellj IDEA常用快捷键

1.生成Getter.Setter方法:Alt + Insert

使用docker部署SqlServer

踩了很多坑,来记录一下 首先说sqlserver 1. 安装docker要使用centos 7以上版本,使用centos 6及以下版本会出现各种问题 2. docker CE安装过程 $ sudo y ...

使用 vagrant新建Linux虚拟机

准备工作 1.下载软件 2.安装软件 2.1 安装VirtualBox-5.1.34-121010-Win.exe 2.2 安装vagrant_2.0.3_x86_64.msi 3.新建 执行指令D: ...

linux手写数字识别opencv,opencv实现KNN手写数字的识别相关推荐

  1. Python+OpenCV:基于KNN手写数据OCR(OCR of Hand-written Data using kNN)

    Python+OpenCV:基于KNN手写数据OCR(OCR of Hand-written Data using kNN) OCR of Hand-written Digits ########## ...

  2. Python+OpenCV实现图像处理OCR手写数字识别原理

    文章目录 一.基本原理 1.载入训练图片: 2.图片分割: 3.灰度处理: 4.数据矩阵化: 5.分配训练集与测试集: 6.将训练测试集进行标定: 7.创建KNN邻近: 8.使用测试集: 二.具体代码 ...

  3. 【OpenCV/C++】KNN算法识别数字的实现原理与代码详解

    KNN算法识别数字 一.KNN原理 1.1 KNN原理介绍 1.2 KNN的关键参数 二.KNN算法识别手写数字 2.1 训练过程代码详解 2.2 预测分类的实现过程 三.KNN算法识别印刷数字 2. ...

  4. Python+OpenCV:基于SVM手写数据OCR(OCR of Hand-written Data using SVM)

    Python+OpenCV:基于SVM手写数据OCR(OCR of Hand-written Data using SVM) dsize = 20 affine_flags = lmc_cv.WARP ...

  5. 基于TensorFlow深度学习框架,运用python搭建LeNet-5卷积神经网络模型和mnist手写数字识别数据集,设计一个手写数字识别软件。

    本软件是基于TensorFlow深度学习框架,运用LeNet-5卷积神经网络模型和mnist手写数字识别数据集所设计的手写数字识别软件. 具体实现如下: 1.读入数据:运用TensorFlow深度学习 ...

  6. 基于python的手写数字识别实验报告_联机手写数字识别实验报告

    1 联机手写数字识别设计 一.设计论述 模式识别是六十年代初迅速发展起来的一门学科. 由于它研究的是如何用机 器来实现人 ( 及某些动物 ) 对事物的学习. 识别和判断能力, 因而受到了很多科技 领域 ...

  7. 数字图像处理 使用opencv+python识别七段数码显示器的数字

    一.什么是七段数码显示器 七段LCD数码显示器有很多叫法:段码液晶屏.段式液晶屏.黑白笔段屏.段码LCD液晶屏.段式显示器.TN液晶屏.段码液晶显示器.段码屏幕.笔段式液晶屏.段码液晶显示屏.段式LC ...

  8. Python3:《机器学习笔记与实战》之Knn算法(2)识别手写数字

    Python3:<机器学习笔记与实战>之Knn算法(2)识别手写数字 转载请注明作者和出处:https://blog.csdn.net/weixin_41858342/article/de ...

  9. 数字图像处理二维码识别 python+opencv实现二维码实时识别

    数字图像处理二维码识别 python+opencv实现二维码实时识别 特点: (1)可以实现普通二维码,条形码: (2)解决了opencv输出中文乱码的问题 (3)增加网页自动跳转功能 (4)实现二维 ...

最新文章

  1. 接口测试,接口协议以及常用接口测试工具介绍
  2. Microsoft 的 OpenSource Licence
  3. shell脚本复制文件夹内容到另外的文件夹,如果存在则自动备份
  4. 首次使用Cesium加载3D数据成功
  5. php unlike,PHP结合jQuery实现的评论顶、踩功能
  6. C语言中的标识符作用域
  7. zb——中国人发起的编程语言之序章
  8. 【147天】尚学堂高淇Java300集视频精华笔记(108-109)
  9. MATLAB字符数组和空数组
  10. mybatis_Mapped Statements collection already contains value
  11. python获取当前路径的方法
  12. Python txt转换为excel
  13. 中国国内市级城市英文名称
  14. Flash烛光动画特效实例教程
  15. 逐浪海棠居刻本字-第一款基于unicode13标准构建的中文字库全面发布
  16. Excel 动态透视表
  17. 【gitee】fatal: unable to access ‘https://username:password@gitee.com: Port number ended with ‘l‘
  18. 可该变某一属性的GAN:Hijack-GAN
  19. 量化投资分析:定量分析项目和交易分析指标
  20. 从阿里云下载centos的步骤

热门文章

  1. 未来,机器人帮你盖房子
  2. X86智能相机视觉系统解决方案
  3. 模拟Web 服务器磁盘满故障深入解析
  4. python 中关于py2exe打包
  5. [Java] 初始化与清理
  6. typedef、setw()
  7. linux AS 5 DNS 配置中的小错误
  8. Windows 7使用MMC管理控制台“远程桌面”功能【转载】
  9. h3c交换机限制端口访问_H3C交换机端口限速和流量监管典型配置指导
  10. mysql 安装包_ubuntu下安装mysql全记录