opencv python 对指针仪表读数识别的两种方式

介绍

指针仪表是一种广泛应用于电力、石油、化工等行业的测量仪器,它通常以指针的位置来显示被测量量的数值。为了提高工作效率,在一些场合下需要对指针仪表的读数进行自动识别。本文将介绍如何使用opencv python对指针仪表进行读数识别,主要包括两种方式:基于图像处理的方法和基于深度学习的方法。

图像处理方法

图像预处理

在使用图像处理方法进行指针仪表读数识别之前,首先需要进行图像预处理。图像预处理是图像处理的一个重要环节,它可以有效地提高后续处理的准确性和稳定性。对于指针仪表,通常需要进行以下几个步骤的处理。

灰度化:将原始图像转化为灰度图像。

滤波:使用高斯滤波或中值滤波等方法对图像进行去噪处理。

二值化:将图像转化为黑白二值图像,以便于后续处理。

下面给出一个图像预处理的示例代码。

import cv2

# 读取原始图像

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

# 将图像转化为灰度图像

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

# 对灰度图像进行高斯滤波

blur = cv2.GaussianBlur(gray, (5,5), 0)

# 对滤波后的图像进行二值化处理

thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)[1]

# 显示预处理后的图像

cv2.imshow('thresh', thresh)

cv2.waitKey()

cv2.destroyAllWindows()

寻找指针位置

在图像预处理之后,需要对处理后的图像进行进一步处理,以寻找指针所在的位置。一般情况下,指针在仪表盘中是唯一的明亮的长条形区域。因此可以通过查找最亮的区域来寻找指针所在的位置。具体做法如下:

寻找最亮的区域:使用cv2.findContours函数查找图像中的轮廓,并计算每个轮廓的面积和中心位置,以找到最亮的区域。

确定指针范围:根据最亮的区域和仪表盘中心点的位置确定指针的范围。

计算指针角度:根据指针的范围,计算指针相对于仪表盘中心的角度。

下面给出一个寻找指针位置的示例代码。

import cv2

import numpy as np

# 读取预处理后的图像

thresh = cv2.imread('thresh.jpg', 0)

# 查找图像中的轮廓

cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

cnts = cnts[0] if len(cnts) == 2 else cnts[1]

# 初始化最亮的面积和位置

max_area = 0

max_pos = None

# 遍历所有轮廓,找到最亮的区域

for c in cnts:

area = cv2.contourArea(c)

if area > max_area:

max_area = area

M = cv2.moments(c)

if M["m00"] == 0:

continue

cx = int(M["m10"] / M["m00"])

cy = int(M["m01"] / M["m00"])

max_pos = (cx, cy)

# 计算仪表盘中心点

h, w = thresh.shape[:2]

center = (w/2, h/2)

# 计算指针范围和相对角度

if max_pos is not None:

angle = np.arctan2(max_pos[1] - center[1], max_pos[0] - center[0]) * 180 / np.pi

if angle < 0:

angle += 360

print('angle:', angle)

# 显示结果

cv2.imshow('thresh', thresh)

cv2.waitKey()

cv2.destroyAllWindows()

深度学习方法

数据准备

与图像处理方法相比,深度学习方法需要准备大量的数据来进行模型训练。对于指针仪表读数识别,可以使用类似MNIST的数据集来进行训练。具体步骤如下:

收集数据:从实际的指针仪表中收集图像数据,并标注每个数据对应的读数。

数据预处理:对收集到的数据进行预处理,包括去噪、剪裁等操作。

数据分割:将数据集按照一定比例划分为训练集、验证集和测试集。

模型设计

对于指针仪表读数识别,可以使用卷积神经网络(CNN)来进行处理。CNN是深度学习中常用的一种网络结构,它能够有效地提取并学习图像的特征。具体构建方式如下:

输入层:将预处理后的图像数据输入CNN模型。

卷积层:使用多个卷积核对输入图像进行卷积处理,提取图像的特征。

池化层:对卷积结果进行池化,减小数据量,提高模型的泛化能力。

全连接层:将卷积和池化层得到的特征图像转化为一维向量,并输入到全连接层进行分类。

输出层:输出模型的分类结果,即指针所指的数值。

模型训练

对于指针仪表读数识别模型,可以使用常用的深度学习框架如Tensorflow、Keras等进行训练。训练过程中需要注意以下几个因素:

选择优秀的模型结构:不同的模型结构对于数据的表示能力不同,需要进行有效的实验和比较,选择优秀的模型结构。

选择优秀的优化器:优化器的选择对于模型的训练效率和泛化能力非常重要,需要进行实验和比较。

进行合适的超参数调整:训练过程中需要对学习率、正则项系数等进行适当的调整,以获得更好的训练效果。

模型测试

训练完成后,需要对模型进行测试评估。评估模型的效果需要使用测试数据集来进行评估,一般常用的评估指标包括精确度、召回率、F1-score等。除了使用测试数据集进行评估外,还可以使用实际的仪表盘进行测试,评估模型在实际应用环境下的效果。

总结

本文介绍了使用opencv python对指针仪表读数的识别方法,其中包括了基于图像处理的方法和基于深度学习的方法。两种方法各有优缺点,可根据实际应用场景进行选择。对于图像处理方法,需要较多的人为经验和手动调参,但实现难度较低,运行速度快。对于深度学习方法,需要较多的计算资源和训练时间,但能够获得更好的泛化能力和识别精度。建议在实际应用中综合考虑以上因素,选择最适合当前场景的方法。

后端开发标签