基于机器视觉算法笔迹识别机器人设计

编程入门 行业动态 更新时间:2024-10-25 03:32:03

基于机器视觉算法<a href=https://www.elefans.com/category/jswz/34/1392079.html style=笔迹识别机器人设计"/>

基于机器视觉算法笔迹识别机器人设计

步骤

一、构建底层下位机硬件

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)     #打印出发送过来的字符

更多推荐

基于机器视觉算法笔迹识别机器人设计

本文发布于:2024-03-12 05:50:40,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1730828.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:笔迹   机器人   算法   视觉   机器

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!