手写多位数字识别器实现 (转载请注明出处!)

该手写数字识别器包含以下功能:

界面化的输入方式,进行实时数字识别

②可以识别多位的数字,例如23234

③可以选择多种识别方式,例DNNCNN

 

代码语言为Python,神经网络的模型是直接调用训练好的,用Tensorflow实现,对图片的预处理等是利用opencv和PIL实现的,界面使用PyQt5,该识别器可以实时识别从GUI中画出的数字图片,利用截图的方式存储图片,并对图片进行预处理,进行字符分割成多个图片分别进行CNN或DNN识别,最终以一图一数字的形式组合返回至前端。

 

具体过程:

 

具体的界面代码在下方的链接中,这里稍微说一下图片的处理:

pic=cv2.resize(img,(96,80),interpolation=cv2.INTER_CUBIC) #改变大小,同截图的比例缩放

pic = cv2.cvtColor(pic,cv2.COLOR_BGR2GRAY) #灰度化

for index,i in enumerate(pic):  #将图像像素二值化,黑白区分为下面图片分割准备
    for indey,j in enumerate(i):
        if (j>200):
            pic[index][indey] = 0
        else:
            pic[index][indey] = 240

#以行切割
row_nz = []
for row in pic.tolist():
        row_nz.append(len(row) - row.count(0))

upper_y = 0
for i,x in enumerate(row_nz):
    if x >= 2:   #这里2可以改为其他值
        upper_y = i
        break
			
lower_y = 0
for i,x in enumerate(row_nz[::-1]):
    if x>=2:
        lower_y = len(row_nz) - i
        break
			
sliced_y_img = pic[upper_y:lower_y,:]
    
#以列切割
col_nz = []
for col in sliced_y_img.T.tolist():
    col_nz.append(len(col) - col.count(0))
	
column_boundary_list = []
record = False
for i,x in enumerate(col_nz[:-1]):
    if (col_nz[i] <= 2 and col_nz[i+1] > 2) or col_nz[i] > 2 and col_nz[i+1] <= 2:
            column_boundary_list.append(i+1)

#存储分割后的图片
img_list = []
xl = [ column_boundary_list[i:i+2] for i in range(0,len(column_boundary_list),2) ]
print('xl is:',xl)
for x in xl:
    img_list.append(sliced_y_img[:,x[0]:x[1]] )

img_list = [ x for x in img_list if x.shape[1] > 5 ]

最后再对img_list里的图片调用识别函数进行识别,返回单一数字加入数字集中。

 

样例:

 

欢迎探讨,转载请注明出处。

完整代码:https://download.csdn.net/download/weixin_42029979/11253416

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页