数字式仪表识别python+树莓派3B,识别结果传回上位机

数字式仪表识别python+树莓派3B,识别结果传回上位机

  • 一、系统介绍
    • 硬件选型
    • 系统整体结构
    • 实物
  • 二、算法设计
    • 图像预处理
    • 倾斜校正
    • 字符定位分割
    • SVM数字识别
  • 三、识别效果

一、系统介绍

这是我本科毕设的项目,想法来源于很火很成熟的车牌识别,数字式仪表识别与之类似,而且省去了识别汉字和字母的部分,使得系统识别准确性更高。但在定位时,由于不能利用颜色信息,定位的实现要稍作改变。
GitHub:
传送门

硬件选型

综合考虑系统需求,选用树莓派3B型作为控制器
数字式仪表识别python+树莓派3B,识别结果传回上位机_第1张图片
树莓派性能强大、运行稳定、外形小巧,有丰富的接口引脚,自带Wi-Fi、摄像等模块。
数字式仪表识别python+树莓派3B,识别结果传回上位机_第2张图片
摄像头选用树莓派官方摄像头,像素500万。

系统整体结构

数字式仪表识别python+树莓派3B,识别结果传回上位机_第3张图片

实物

数字式仪表识别python+树莓派3B,识别结果传回上位机_第4张图片

二、算法设计

本系统使用python语言编程,利用opencv开源代码库,代码简单,调参容易

图像预处理

读入原图像:

img=cv2.imread('1.jpg')

数字式仪表识别python+树莓派3B,识别结果传回上位机_第5张图片
高斯滤波:

 blur = 3
 img = cv2.GaussianBlur(img, (blur, blur), 0)

数字式仪表识别python+树莓派3B,识别结果传回上位机_第6张图片
灰度化:

 img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

数字式仪表识别python+树莓派3B,识别结果传回上位机_第7张图片
Otsu阈值化:

ret, img_thresh = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

数字式仪表识别python+树莓派3B,识别结果传回上位机_第8张图片

倾斜校正

在仪表图像的实际拍摄过程中,由于人手持的不稳定,采集到的图像很容易发生倾斜,若倾斜角度过大,会严重影响字符定位分割的效果,进而会对后续的识别产生不利影响,所以在倾斜严重时需要对图像进行旋转校正。本文使用Hough直线检测来矫正,由于Hough变换运算量过大,所以应先进行Canny边缘检测
Canny提取边缘:

edges = cv2.Canny(img_thresh,50,150,apertureSize = 7)

数字式仪表识别python+树莓派3B,识别结果传回上位机_第9张图片
Hough检测+旋转变换:

def hough_change(edges):

    #霍夫变换
    lines = cv2.HoughLines(edges,1,np.pi/180,0)
    for rho,theta in lines[0]:
        a = np.cos(theta)
        b = np.sin(theta)
        x0 = a*rho
        y0 = b*rho
        x1 = int(x0 + 1000*(-b))
        y1 = int(y0 + 1000*(a))
        x2 = int(x0 - 1000*(-b))
        y2 = int(y0 - 1000*(a))
        
    if x1 == x2 or y1 == y2:
        rotate_img=img
    else:
        t = float(y2-y1)/(x2-x1)
        rotate_angle = math.degrees(math.atan(t))
        if rotate_angle > 45:
            rotate_angle = -90 + rotate_angle
        elif rotate_angle < -45:
            rotate_angle = 90 + rotate_angle
        rotate_img = ndimage.rotate(img, rotate_angle)
    return rotate_img  

数字式仪表识别python+树莓派3B,识别结果传回上位机_第10张图片

字符定位分割

对校正后的图进行闭开运算:

Matrix = np.ones((5, 3), np.uint8)
#闭开
img_edge1 = cv2.morphologyEx(img_thresh2, cv2.MORPH_CLOSE, Matrix)         
Matrix = np.ones((5, 20), np.uint8)    
img_edge2 = cv2.morphologyEx(img_edge1, cv2.MORPH_OPEN, Matrix)

数字式仪表识别python+树莓派3B,识别结果传回上位机_第11张图片
然后再利用轮廓检测,检测矩形,再根据矩形的面积和长宽比初步确定表盘的位置。要注意的是,在此过程中,小数部分会被去除,暂时还没有想到较好的检测小数部分的方法。
粗分割后再利用投影法进行细分割并归一化:
数字式仪表识别python+树莓派3B,识别结果传回上位机_第12张图片

SVM数字识别

本设计选用SVM(Support Vector Machine支持向量机)进行数字识别
SVM是一种分类器,其原理就是找到一个集合超平面将数据分离开,并使两类数据几何间隔最大。

数字式仪表识别python+树莓派3B,识别结果传回上位机_第13张图片
对于线性不可分的数据集,则先进行非线性变换投射到高维空间再分割,这一过程由核函数完成。

数字式仪表识别python+树莓派3B,识别结果传回上位机_第14张图片
整体识别过程:
数字式仪表识别python+树莓派3B,识别结果传回上位机_第15张图片
识别结果:
在这里插入图片描述

三、识别效果

使用python自带的tkinter可视化结构来实现用户界面的搭建和显示,由于时间关系以及设计需求,远程中心界面未进行设计。
数字式仪表识别python+树莓派3B,识别结果传回上位机_第16张图片
用户界面和远程中心使用Socket进行通信:
在这里插入图片描述
在这里插入图片描述

完整代码:
完整代码下载

有任何问题欢迎联系,留言或者发邮箱[email protected]皆可

你可能感兴趣的:(计算机视觉,python,opencv,人工智能)