笔迹识别机器人设计"/>
基于机器视觉算法笔迹识别机器人设计
步骤
一、构建底层下位机硬件
1、构建由单片机、液晶显示屏、无线通信模块组合而成的下位机硬件系统,包括单片机、液晶显示屏、无线通信等。
2、人机交互功能的设计,使用液晶显示屏能与用户实现功能交互
3、无线通信功能的设计,实现机器人与上位机的数据通信,从而能接收上位机信号并进行处理。
二、机器视觉算法的研究以及实现
1、对各种机器人视觉算法进行研究以及实验,寻找符合要求的算法
2、数据的收集以及清洗,由于机器视觉算法的实现需要大量的训练数据,而数据的准确又直接影响模型的精度,因此我们需要在这一步将笔迹图片处理为所能使用的数据集,并且对数据进行清洗以消除噪声影响。
3、模型的训练以及验证测试,在这一步中,我们对已经处理的数据进行训练,从而训练出一个可用的模型。在其中会经历参数调优、模型重建、特征工程等步骤。
三、整体系统组合
1、上位机与下位机的通信对接
2、上位机接收待识别信号后,根据已训练好模型进行识别,识别完成后,通过通信发生识别好的数据使用无线串口传输至下位机。
3、下位机接收到识别好的信号后,设计相应处理程序,根据不同的信号进行不同处理,并输出至液晶屏进行交互
实施办法
使用机器视觉算法对已采集处理好的训练数据进行训练,得出一个经过优化训练好的模型。根据已训练好的模型并结合编程语言构建与下位机的通信接口,在上位机中设计一个集笔迹识别、通信传输于一体的程序,在下位机中组建好硬件并设计好底层驱动程序,上位机与下位机对接实现整个系统的功能。
第一部分是对图片进行预处理而后进行PCA降维,最后再训练模型的代码
# -*- coding: utf-8 -*-
"""
Created on Thu Mar 16 21:02:25 2017
@author: Administrator
"""
#!/user/bin/env python
#-*- coding:utf-8 -*-
import numpy as np
#import mlpy
import cv2
from sklearn.decomposition import PCA
from sklearn import svm
import os
from sklearn.externals import joblib
print ("loading ...")
def getnumc(fn):
'''返回数字特征,形成一个8维的行向量'''
fnimg=cv2.imread(fn) #读取图像
img=cv2.resize(fnimg,(28,28))#将一个图片变为28*28大小的
alltz=[]
for now_h in range(0,28):
xtz=[]
for now_w in range(0,28):
b=img[now_h,now_w,0]
g=img[now_h,now_w,1]
r=img[now_h,now_w,2]
btz=b
gtz=g
rtz=r
if btz>0 or gtz>0 or rtz>0:
nowtz=1
else:
nowtz=0
xtz.append(nowtz) #在列表末尾添加新的对象
alltz+=xtz
return alltz
x=[]
y=[]
for numi in range(0,10):#从0开始到9
cou=len(os.listdir("D:/python project/trainimage/"+str(numi)))
for numij in range(1,cou):
fn='trainimage/'+str(numi)+'/'+str(numij)+'.bmp'
print("正在转换“"+str(numi)+"”的第"+str(numij)+"张图片...\n")
x.append(getnumc(fn))
y.append(numi)
print("图片转换完毕")
x=np.array(x)
y=np.array(y)
np.savetxt('data_x.csv',x,delimiter = ',')
np.savetxt('data_y.csv',y,delimiter = ',')
print("源数据文件已保存")
#svm=mlpy.LibSvm(svm_type='c_svc',kernel_type='poly',gamma=10)
#svm.learn(x,y)
#print (svm.pred(x))
print("开始训练向量机模型。。。")
'''PCA降维操作'''
pca = PCA(n_components = 0.8,whiten = True)
train_x = pca.fit_transform(x)
np.savetxt('train_x.csv',train_x,delimiter = ',')
print("降维后的数据已保存为 train_x")
'''SVM模型'''
print("SVM load。。。")
#test_x = pca.transform(test_data)
svc = svm.SVC(kernel = 'rbf',C = 10)
svc.fit(train_x,y)
pre = svc.predict(train_x)
print(pre)
print("SVM finished")
#使用数据进行测试
print("识别结果")
for iii in range(1,17):
testfn='D:/python project/testimage/'+str(iii)+'.bmp'
testx=[]
testx.append(getnumc(testfn))
testx=pca.transform(testx)#测试数据也要进行PCA降维操作
print (svc.predict(testx))
'''保存训练好的模型'''
os.chdir("model_save/")
joblib.dump(svc, "svc_train_model.m")
print("svc模型已保存")
joblib.dump(pca,"pca_svc_train_model.m")
print("pca模型已保存")
'''调回模型'''
svc= joblib.load("svc_train_model.m")
pca=joblib.load("pca_svc_train_model.m")
第二部分是上位机发送给下位机的代码
import numpy as np
#import mlpy
import cv2
from sklearn.decomposition import PCA
from sklearn import svm
import os
from sklearn.externals import joblib
import serial
print ("loading ...")
'''图像处理为矩阵函数'''
def getnumc(fn):
'''返回数字特征,形成一个8维的行向量'''
fnimg=cv2.imread(fn) #读取图像
img=cv2.resize(fnimg,(28,28))#将一个图片变为28*28大小的
alltz=[]
for now_h in range(0,28):
xtz=[]
for now_w in range(0,28):
b=img[now_h,now_w,0]
g=img[now_h,now_w,1]
r=img[now_h,now_w,2]
btz=b
gtz=g
rtz=r
if btz>0 or gtz>0 or rtz>0:
nowtz=1
else:
nowtz=0
xtz.append(nowtz) #在列表末尾添加新的对象
alltz+=xtz
return alltz
'''串口发送函数'''
def serial_trans(data_result):
a=data_result[0]
a=chr(a+0x30)
a =a.encode("ascii") #必须进行字符码转换
n = t.write(a) #串口发送该字符串,n是获取字符串个数
'''调回模型函数'''
def bmp_deal(testfn):
data_result=[] #返回的参数首先要进行定义
svc= joblib.load("D:/python project/model_save/svc_train_model.m")
pca=joblib.load("D:/python project/model_save/pca_svc_train_model.m")
testx=[]
testx.append(getnumc(testfn))
testx=pca.transform(testx)#测试数据也要进行PCA降维操作
data_result=svc.predict(testx)
print ('图片识别结果:',data_result)
return data_result
t = serial.Serial('COM4',9600)
#t.open()
testfn='D:/python project/testimage/'+str(20)+'.bmp'
b=bmp_deal(testfn)
serial_trans(b)
#t.close()
print (t.portstr) #打印串口标识号
print (n) #打印出串口发送的字符串个数
str = t.read(n) #读取串口发送过来的字符
print (str) #打印出发送过来的字符
更多推荐
基于机器视觉算法笔迹识别机器人设计
发布评论