基于opencv实现的手写数字识别
一、使用模板匹配算法
match.py:
import os
import Function
root_dir = "digits/train2"
file7_7 = open("digits/picture7_7.txt", 'w+')
for fl in os.listdir(root_dir):
img_str = fl[0:-4] + ":" + Function.image_compression(root_dir + '/' + fl)
file7_7.write(img_str + '\n')
file7_7.close()
file7_7 = open("digits/picture7_7.txt", 'r')
root_dir = "digits/test"
Correct_rate = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Error_rate = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Rejection_rate = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
for fl in os.listdir(root_dir):
Same_dist_number = 0
Same_class = -1
min_dist = 7
dist_img = ""
test_img_str = Function.image_compression(root_dir + '/' + fl)
while True:
line = file7_7.readline()
if not line:
file7_7.seek(0)
break
train_str = line[-50:-1]
temp_dist = Function.distance(test_img_str, train_str)
if temp_dist < min_dist:
min_dist = temp_dist
dist_img = line[0:-51]
Same_dist_number = 0
Same_class = -1
elif temp_dist == min_dist:
Same_dist_number += 1
if dist_img[0:1] == line[0:1]:
Same_class = eval(line[0:1])
else:
Same_class = -1
if Same_dist_number == 0:
print("测试数字:", fl[0:-4], " -- 识别出来的结果:", dist_img)
if fl[0] == dist_img[0]:
Correct_rate[eval(fl[0])] += 1
else:
Error_rate[eval(fl[0])] += 1
elif Same_class == -1:
print("测试数字:", fl[0:-4], " -- 该数字拒绝识别!")
Rejection_rate[eval(fl[0])] += 1
else:
print("测试数字:", fl[0:-4], " -- 识别出来的结果(类):", Same_class)
if eval(fl[0]) == Same_class:
Correct_rate[eval(fl[0])] += 1
else:
Error_rate[eval(fl[0])] += 1
file7_7.close()
print("------------------------------------------------")
for i in range(10):
print("数字 {:d} 识别的正确率 = {:.2f}% ,错误率 = {:.2f}% ,拒绝识别率 = {:.2f}%".format(i, Correct_rate[i] * 5, Error_rate[i] * 5,
Rejection_rate[i] * 5))
print("成功!")
Function.py:
import cv2
def image_compression(img_path):
img_str = ""
img = cv2.imread(img_path)
x = y = 0
for k in range(1, 50):
title_imf = 0
for i in range(4):
for j in range(4):
if img[x + i - 1][y + j - 1][0] > 127:
title_imf += 1
y = (y + 4) % 28
if title_imf >= 13:
img_str += '1'
else:
img_str += '0'
if k % 7 == 0:
x = x + 4
y = 0
return img_str
def distance(test_str, train_str):
len_str = len(train_str)
dist = 0.0
for i in range(len_str):
dist += (eval(test_str[i:i + 1]) - eval(train_str[i:i + 1])) ** 2
dist **= 0.5
return dist
二、k邻近算法实现
k.py
import os
import numpy as np
import Function2
def handwritingClassficationTest():
hwLabels = []
trainingFileList = os.listdir('digits/trainingDigits')
m = len(trainingFileList)
trainingMat = np.zeros((m, 1024))
for i in range(m):
fileNameStr = trainingFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
hwLabels.append(classNumStr)
trainingMat[i, :] = Function2.img2vector('digits/trainingDigits/%s' % fileNameStr)
testFileList = os.listdir('digits/testDigits')
errorCount = 0.0
mTest = len(testFileList)
for i in range(mTest):
fileNameStr = testFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
vectorUnderTest = Function2.img2vector('digits/testDigits/%s' % fileNameStr)
classifierResult = Function2.classify0(vectorUnderTest, trainingMat, hwLabels, 3)
print("测试出的数字是: %s, 正确的数字是: %s" % (classifierResult, classNumStr))
if (classifierResult[0] != classNumStr): errorCount += 1.0
print("\n 识别错误的个数是: %s" % errorCount)
print("\n 正确率为: %f" % (1 - errorCount / float(mTest)))
handwritingClassficationTest()
Function2.py:
from os import listdir
from numpy import *
import operator
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances ** 0.5
sortedDistIndicies = distances.argsort()
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0]
def img2vector(filename):
returnVect = zeros((1, 1024))
fr = open(filename)
for i in range(32):
lineStr = fr.readline()
for j in range(32):
returnVect[0, 32 * i + j] = int(lineStr[j])
return returnVect
def identify(image):
imageVector = zeros((1, 1024))
for i in range(32):
for j in range(32):
imageVector[0, 32 * i + j] = int(image[i][j])
hwLabels = []
trainingFileList = listdir('digits/trainingDigits')
m = len(trainingFileList)
trainingMat = zeros((m, 1024))
for i in range(m):
fileNameStr = trainingFileList[i]
fileStr = fileNameStr.split('.')[0]
classNumStr = int(fileStr.split('_')[0])
hwLabels.append(classNumStr)
trainingMat[i, :] = img2vector('digits/trainingDigits/%s' % fileNameStr)
classifierResult = classify0(imageVector[0], trainingMat, hwLabels, 3)
result = {}
result['result1'] = classifierResult[0]
result['result2'] = classifierResult[1]
return result
其中模板匹配使用28*28像素大小的手写数据集,k邻近算法使用二进制手写数据集。
基于opencv实现的手写数字识别相关推荐
- python opencv数字识别_基于模板匹配的手写数字识别(python+opencv)
智能计算课第一周的实验是做基于模板匹配的手写数字识别,光听见就很感兴趣,于是决定认真做做这个实验,本实验基于python3+opencv的python版本,所用到的知识都比较简单,基本上边学边做,技术 ...
- 基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明)
基于卷积神经网络的手写数字识别(附数据集+完整代码+操作说明) 配置环境 1.前言 2.问题描述 3.解决方案 4.实现步骤 4.1数据集选择 4.2构建网络 4.3训练网络 4.4测试网络 4.5图 ...
- 基于深度学习的手写数字识别算法Python实现
摘 要 深度学习是传统机器学习下的一个分支,得益于近些年来计算机硬件计算能力质的飞跃,使得深度学习成为了当下热门之一.手写数字识别更是深度学习入门的经典案例,学习和理解其背后的原理对于深度学习的理解有 ...
- 基于深度学习的手写数字识别、python实现
基于深度学习的手写数字识别.python实现 一.what is 深度学习 二.加深层可以减少网络的参数数量 三.深度学习的手写数字识别 一.what is 深度学习 深度学习是加深了层的深度神经网络 ...
- 基于K210的MNIST手写数字识别
基于K210的MNIST手写数字识别 项目已开源链接: Github. 硬件平台 采用Maixduino开发板 在sipeed官方有售 软件平台 使用MaixPy环境进行单片机的编程 官方资源可在这里 ...
- 基于深度学习的手写数字识别Matlab实现
基于深度学习的手写数字识别Matlab实现 1.网络设计 2. 训练方法 3.实验结果 4.实验结果分析 5.结论 1.网络设计 1.1 CNN(特征提取网络+分类网络) 随着深度学习的迅猛发展,其应 ...
- MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试
文章目录 MATLAB实现基于BP神经网络的手写数字识别+GUI界面+mnist数据集测试 一.题目要求 二.完整的目录结构说明 三.Mnist数据集及数据格式转换 四.BP神经网络相关知识 4.1 ...
- 手把手教你使用LabVIEW OpenCV DNN实现手写数字识别(含源码)
文章目录 前言 一.OpenCV DNN模块 1.OpenCV DNN简介 2.LabVIEW中DNN模块函数 二.TensorFlow pb文件的生成和调用 1.TensorFlow2 Keras模 ...
- 课程设计(毕业设计)—基于机器学习KNN算法手写数字识别系统—计算机专业课程设计(毕业设计)
机器学习KNN算法手写数字识别系统 下载本文手写数字识别系统完整的代码和课设报告的链接(或者可以联系博主koukou(壹壹23七2五六98),获取源码和报告):https://download.csd ...
最新文章
- CVPR2020:基于层次折叠的跳跃式注意网络点云完成
- 一步步学习SPD2010--第十一章节--处理母版页(8)--从母版页创建网页
- vue-cli3.0 生产包去除console.log
- Spring MVC GET 从客户端数据到服务器端的乱码和服务器端数据到客户端的乱码
- Ubuntu系统下桌面卡死,但是鼠标键盘可以动
- Windows环境配置Anaconda+cuda+cuDNN+pytorch+jupyter notebook
- 动态加载laydate 失效_Java对象的内存布局+反射的原理+动态代理+ 并发和锁+文末彩蛋...
- 【转】Android开发之数据库SQL
- lin-cms-dotnetcore功能模块的设计
- 互联网晚报 | 3月8日 星期二 |​ ​​沪指深V反弹,创业板指跌幅收窄至0.75%;腾讯低代码平台与微信开发者平台打通...
- 2021高校暑假时间汇总!最长70天
- php与web页面交互
- JavaScript的RegExp实例方法exec()
- A Translation for Quaternion 一篇对四元数的翻译
- XMPP即时通讯资料记录
- 老化测试相关知识点介绍
- 使用FFmpeg将MP4转换为ts文件
- php6基因突变,基因突变中那些“披着狼皮的羊” 很多“致命性”基因突变正在被证实无害...
- 看了这个逻辑关系图,才更清晰为何不让你随便外出了
- Object-based superresolution land cover Mapping From Remotely sensed imagery