目录
选题意义背景
机器视觉技术作为人工智能的重要分支,在工业检测、目标识别等领域得到了广泛应用。与传统的接触式测量相比,基于机器视觉的非接触式测量具有操作简便、响应迅速、精度高等优点。将机器视觉技术应用于电力指针式仪表的自动识读,不仅可以提高读数效率和准确性,还能降低人工成本,为电力系统的智能化运维提供技术支持。

本研究旨在提出一种基于改进BRISK-FREAK算法的表盘定位方法,结合图像预处理技术、改进LSD直线检测算法,实现电力指针式仪表的高效、准确识读。研究成果不仅可以应用于电力行业,还可以推广到化工、石油、冶金等领域的仪表监测,具有重要的理论意义和实用价值。
数据集
数据采集采用了两种数据采集方式:
-
现场拍摄:用工业相机(分辨率1920×1080)对不同类型的电力指针式仪表进行了实地拍摄。拍摄时考虑了不同的光照条件、角度和距离,以模拟实际应用中的各种情况。拍摄的仪表类型包括压力表、电流表、电压表、功率表等常见电力仪表,仪表指针的位置也涵盖了满量程的各个区域。
-
模拟数据生成:为了扩充数据集规模,研究团队还使用计算机图形学技术生成了部分模拟数据。通过建立不同类型仪表的3D模型,设置不同的指针角度、光照条件和背景干扰,生成了大量具有真实感的仪表图像。这种方法不仅可以增加数据量,还可以控制图像中的各种参数,便于后续的算法测试和性能评估。
数据预处理
原始采集的图像需要进行一系列预处理操作,以提高数据质量:
-
图像去噪:针对现场拍摄图像中可能存在的噪声(如椒盐噪声、高斯噪声等),采用中值滤波等方法进行去噪处理,保留图像的边缘信息。
-
图像增强:由于现场光照条件的变化,部分图像可能存在亮度不均或对比度低的问题。研究团队采用直方图均衡化、对比度增强等方法,改善图像的视觉效果,提高后续处理的准确性。
-
图像缩放:为了统一数据格式,将所有图像调整到相同的分辨率(如640×480),便于后续的算法处理。
数据标注
数据标注是构建训练集和测试集的关键步骤,本研究采用了人工标注和自动标注相结合的方式:
-
表盘区域标注:标注人员使用标注工具在图像上框选出仪表表盘的位置,生成矩形边界框的坐标信息。
-
圆心标注:标注人员在图像上标记出仪表表盘的圆心位置,作为后续指针角度计算的基准点。
-
刻度线标注:标注起始刻度线和终止刻度线的位置,以及对应的刻度值,用于建立角度与读数的映射关系。
-
指针标注:标注指针的位置和方向,包括指针的起点(通常为圆心)和终点,以及指针所指向的实际读数。
数据类别
经过数据采集和预处理,最终构建的数据集包含以下内容:
- 总图像数量:128张高质量电力指针式仪表图像
- 仪表类型:包括10种不同类型的电力仪表,涵盖了常见的压力表、电流表、电压表、功率表等
- 数据多样性:
- 光照条件:正常光照、弱光照、强光照、光照不均等5种情况
- 角度变化:0°-45°范围内的多角度拍摄
- 距离变化:近、中、远3种拍摄距离
- 背景干扰:纯色背景、复杂背景、部分遮挡等情况
- 表盘状态:清洁表盘、轻微污染表盘、严重污染表盘
功能模块
本研究设计的电力指针式仪表自动识读系统包含多个功能模块,每个模块负责特定的任务,共同完成从图像输入到读数输出的整个过程。以下是各个功能模块的详细介绍:
图像获取
图像获取模块是系统的输入部分,负责从各种来源获取仪表图像。该模块具有以下功能:
-
相机接口:支持连接工业相机、网络摄像头等设备,实现实时图像采集。系统通过调用OpenCV库的VideoCapture函数,初始化相机设备并设置参数(如分辨率、帧率等)。
-
图像读取:支持从本地文件系统读取图像,支持常见的图像格式(如JPG、PNG、BMP等)。系统提供了用户友好的文件选择界面,用户可以浏览并选择需要处理的图像文件。
-
图像预处理:在将图像传递给后续模块之前,对图像进行初步处理,如调整大小、转换色彩空间等,以适应系统的处理需求。
表盘定位
表盘定位模块负责在复杂背景中准确识别并定位仪表表盘,是整个识别过程的关键步骤。该模块基于改进的BRISK-FREAK算法实现,主要流程如下:
-
模板图像准备:预先准备各种类型仪表的模板图像,作为特征匹配的参考。模板图像应包含完整的表盘区域,背景简洁,便于提取特征点。
-
特征提取:使用BRISK算法对输入图像和模板图像分别提取特征点,对于每个特征点,使用FREAK描述子生成二进制特征描述符,FREAK描述子通过比较特征点周围特定位置对的亮度关系,生成紧凑的二进制编码
-
特征匹配:采用KNN(K最近邻)算法进行初步特征匹配,为每个特征点找到最相似的K个匹配点,使用RANSAC(随机抽样一致性)算法消除误匹配,估计图像之间的变换矩阵,根据变换矩阵,计算模板图像在输入图像中的位置和姿态
-
表盘区域提取:根据定位结果,从输入图像中裁剪出表盘区域,作为后续处理的输入。
指针定位
指针定位模块负责在预处理后的表盘图像中准确识别并定位指针,是实现准确读数的关键。该模块基于改进的LSD直线检测算法,主要流程如下:
-
霍夫圆变换:
- 应用霍夫圆变换检测表盘的圆心位置
- 根据检测到的圆心,确定指针的旋转中心
- 霍夫圆变换能够在存在噪声和部分遮挡的情况下准确检测圆形

-
改进LSD直线检测:
- 使用改进的LSD算法检测图像中的直线段
- 对检测到的直线段进行筛选,排除刻度线、边框等干扰线段
- 基于线段的长度、位置、方向等特征,识别出指针线段

-
指针方向确定:
- 根据指针线段的两个端点和圆心的位置关系,确定指针的方向
- 计算指针与参考方向(如起始刻度线方向)之间的夹角
读数识别
读数识别模块基于指针的角度信息,结合仪表的刻度信息,计算出最终的读数。该模块支持两种读数识别方法:
-
距离法:根据指针端点到起始刻度线和终止刻度线的距离比例,计算读数,适用于刻度均匀分布的仪表

-
角度法:根据指针与起始刻度线之间的夹角,结合仪表的量程和刻度分布,计算读数,计算公式为:读数 = 起始值 + (夹角/总夹角范围) × (终止值 - 起始值),本系统主要采用角度法,具有更高的准确性和通用性
-
指针指向性判断:通过分析指针的颜色、形状等特征,确定指针的指向(顺时针或逆时针),结合刻度分布信息,确保读数计算的正确性
算法理论
本研究涉及多种图像处理和模式识别算法,下面将详细介绍这些算法的理论基础和改进方法。
BRISK特征提取
BRISK 是一种二进制特征描述算法,具有尺度不变性和旋转不变性。其核心思想是通过在特征点周围构建高斯金字塔,实现尺度空间的特征提取,BRISK算法的主要步骤包括:
-
特征点检测:使用FAST角点检测算法在不同尺度空间中检测候选特征点,然后通过非极大值抑制筛选出最终的特征点。
-
尺度确定:为每个特征点确定最佳尺度,通过构建高斯金字塔实现尺度空间的表示。
-
方向分配:计算特征点周围像素点的梯度直方图,选择主方向作为特征点的方向,实现旋转不变性。
-
特征描述:在特征点周围的环形区域内,选择512对采样点,比较每对采样点的亮度值,生成512位的二进制特征描述符。

BRISK算法的优点是计算速度快,特征描述符存储效率高,适合实时应用。但其缺点是在复杂背景和光照变化条件下,特征匹配的准确性可能受到影响。
FREAK特征描述符
FREAK 是一种受人类视网膜启发的二进制特征描述算法,其特点是计算效率高、描述能力强,FREAK算法的主要特点包括:
-
视网膜采样模式:采用类似人类视网膜的对数极坐标采样模式,在特征点周围设置多个同心圆,每个圆上均匀分布若干采样点。

-
成对比较:在采样点中选择特定的点对,比较点对的亮度值,生成二进制编码。
-
特征压缩:通过主成分分析(PCA)对原始特征进行降维,减少特征维度,提高匹配效率。
本研究将FREAK描述符与BRISK特征点检测相结合,形成改进的BRISK-FREAK算法。这种组合充分利用了BRISK在特征点检测方面的优势和FREAK在特征描述方面的优势,提高了特征匹配的准确性和效率。
霍夫变换
霍夫变换是一种用于检测图像中直线、圆等几何形状的经典算法。本研究使用霍夫圆变换检测表盘的圆心位置。霍夫圆变换的基本原理是将图像空间中的圆映射到参数空间,然后在参数空间中寻找累加器的峰值。对于圆的检测,参数空间需要三个参数:圆心坐标(a, b)和半径r。OpenCV中的霍夫圆变换实现(HoughCircles函数)采用了霍夫梯度法,其主要步骤包括:
- 使用Canny边缘检测算法提取图像边缘
- 计算图像中每个像素点的梯度,确定可能的圆心位置
- 对候选圆心进行投票,选择票数最高的点作为圆心
- 根据圆心位置,确定圆的半径
霍夫圆变换能够在存在噪声和部分遮挡的情况下准确检测圆形,因此特别适合表盘圆心的定位。
LSD直线检测
LSD 是一种快速的直线段检测算法,能够在保证低错误率的同时实现直线段的快速检测,传统LSD算法的主要步骤包括:
- 梯度计算:计算图像中每个像素点的梯度强度和方向
- 区域生长:基于梯度方向相似性,将像素点分组形成直线区域
- 矩形拟合:用矩形拟合每个直线区域
- 验证与细化:计算矩形的协方差矩阵,验证是否为真实直线段,并进行细化
改进后的LSD算法在保持检测准确性的同时,显著提高了检测速度和抗干扰能力,特别适合指针式仪表中指针的定位。
K-means聚类
K-means是一种经典的无监督聚类算法,本研究使用K-means算法进行彩色分割,提取起始刻度线。K-means算法的基本思想是将n个样本划分为k个簇,使得簇内样本的相似度高,簇间样本的相似度低。在本研究中,K-means算法用于将彩色图像分割为不同的颜色区域。由于起始刻度线通常具有特定的颜色(如红色),通过聚类可以将其与其他区域(如表盘背景、指针等)区分开来,便于后续的刻度线识别。算法的主要步骤包括:

- 随机选择k个初始聚类中心
- 计算每个样本到各个聚类中心的距离,将样本分配到距离最近的聚类中心
- 根据分配结果,重新计算每个簇的聚类中心
- 重复步骤2和3,直到聚类中心不再变化或达到最大迭代次数
本研究采用角度法进行读数计算,为了处理指针的指向性问题(顺时针或逆时针),系统会根据刻度分布和指针运动方向,自动调整角度计算方法,确保读数的准确性。
通过以上算法的综合应用,系统能够在复杂环境下准确识别电力指针式仪表的读数,满足实际应用的需求。
核心代码
本节将介绍系统中的核心代码片段,包括表盘定位、图像预处理、指针定位和读数计算等关键功能的实现。
表盘定位
基于改进BRISK-FREAK算法的表盘定位功能。首先,使用BRISK检测器分别在输入图像和模板图像中检测特征点,然后用FREAK描述符生成二进制特征描述符。FREAK描述符的优势在于其受人类视网膜启发的采样模式,能够在保持计算效率的同时提供更具区分性的特征描述。接着,采用暴力匹配 和KNN算法进行特征匹配,并应用Lowe比率测试筛选出高质量的匹配点。最后,使用RANSAC算法消除误匹配并估计变换矩阵,从而将模板图像映射到输入图像中,实现表盘的准确定位。
import cv2
import numpy as np
def detect_dial(image, template):
"""
使用改进BRISK-FREAK算法定位表盘
参数:
image: 输入图像
template: 模板图像
返回:
dial_rect: 表盘矩形区域坐标 [x, y, w, h]
"""
# 初始化BRISK检测器
brisk = cv2.BRISK_create()
# 初始化FREAK描述符
freak = cv2.xfeatures2d.FREAK_create()
# 提取特征点和描述符
kp1, des1 = brisk.detectAndCompute(template, None)
kp2, des2 = brisk.detectAndCompute(image, None)
# 生成FREAK描述符
if len(kp1) > 0 and len(kp2) > 0:
des1 = freak.compute(template, kp1)[1]
des2 = freak.compute(image, kp2)[1]
# KNN特征匹配
bf = cv2.BFMatcher(cv2.NORM_HAMMING)
matches = bf.knnMatch(des1, des2, k=2)
# 应用Lowe比率测试筛选好的匹配
good_matches = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
good_matches.append(m)
# 使用RANSAC消除误匹配并估计变换矩阵
if len(good_matches) > 10:
src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
# 获取模板图像的角点
h, w = template.shape[:2]
pts = np.float32([[0, 0], [0, h-1], [w-1, h-1], [w-1, 0]]).reshape(-1, 1, 2)
# 变换角点到输入图像中
dst = cv2.perspectiveTransform(pts, M)
# 计算包围矩形
rect = cv2.boundingRect(dst)
return rect
return None
图像预处理
图像预处理的核心功能,包括灰度化、去噪、二值化和边缘检测四个关键步骤。首先,使用OpenCV的cvtColor函数将彩色图像转换为灰度图像,默认采用加权平均法,这种方法考虑了人眼对不同颜色通道的敏感度,能够保留更多的图像细节。接着,应用中值滤波算法去除图像中的椒盐噪声,选择5×5的滤波窗口,在有效去噪的同时保持边缘清晰。然后,使用Otsu算法进行自适应二值化,该算法能够根据图像的灰度分布自动确定最佳阈值,有效适应不同光照条件下的图像。最后,采用Canny边缘检测算法提取图像边缘,通过设置双阈值(高阈值和低阈值),实现边缘的准确检测和连接。Canny算子的低错误率、高定位精度和抑制虚假边缘的特点,使其特别适合表盘边缘和指针的提取。预处理后的图像为后续的指针定位和读数计算提供了良好的基础。
def preprocess_image(image):
"""
对表盘图像进行预处理
参数:
image: 输入的表盘图像
返回:
edges: 边缘检测后的图像
binary: 二值化后的图像
gray: 灰度图像
"""
# 灰度化处理 - 加权平均法
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 中值滤波去噪
blurred = cv2.medianBlur(gray, 5)
# Otsu自适应二值化
_, binary = cv2.threshold(blurred, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# Canny边缘检测
# 低阈值和高阈值的设置,通常高阈值是低阈值的2-3倍
# 这里使用Otsu阈值的0.4倍作为低阈值,0.8倍作为高阈值
edges = cv2.Canny(blurred, 0.4*_, 0.8*_)
return edges, binary, gray
指针定位
基于改进LSD算法的指针定位功能。首先,使用OpenCV的LineSegmentDetector检测图像中的直线段。然后,根据线段的长度、位置和方向等特征进行筛选,主要考虑以下几个因素:线段长度应适中(既不是太短的噪声线段,也不是太长的边框线段);线段的一个端点应接近圆心(指针的旋转中心);线段的另一个端点应远离圆心(指针的末端)。这些筛选条件能够有效排除刻度线、边框等干扰线段。接着,根据线段的宽度对候选线段进行排序,通常指针线段比刻度线宽,因此选择宽度最大的线段作为最可能的指针。最后,确定指针线段的两个端点,确保一个端点接近圆心,另一个端点远离圆心,以便后续计算指针的角度和方向。该改进LSD算法在保持检测准确性的同时,显著提高了处理速度,能够有效应对复杂背景和干扰条件下的指针检测。
def detect_pointer(edges, center):
"""
使用改进LSD算法检测指针
参数:
edges: 边缘检测后的图像
center: 表盘圆心坐标 (x, y)
返回:
pointer_line: 指针线段的两个端点 [(x1, y1), (x2, y2)]
"""
# 初始化LSD检测器
lsd = cv2.createLineSegmentDetector(0)
# 检测直线段
lines, width, prec, nfa = lsd.detect(edges)
# 筛选可能的指针线段
pointer_candidates = []
if lines is not None:
for i, line in enumerate(lines):
x1, y1, x2, y2 = line[0]
# 计算线段长度
length = np.sqrt((x2-x1)**2 + (y2-y1)** 2)
# 计算线段到圆心的距离
dist1 = np.sqrt((x1-center[0])** 2 + (y1-center[1])** 2)
dist2 = np.sqrt((x2-center[0])** 2 + (y2-center[1])** 2)
# 筛选条件:
# 1. 线段长度适中
# 2. 线段的一个端点接近圆心
# 3. 线段的另一个端点远离圆心
if length > 20 and min(dist1, dist2) < 15 and max(dist1, dist2) > 50:
# 计算线段与圆心的夹角(用于后续排序)
if dist1 < dist2:
angle = np.arctan2(y2 - center[1], x2 - center[0])
pointer_candidates.append((line[0], abs(width[i][0]), angle))
else:
angle = np.arctan2(y1 - center[1], x1 - center[0])
pointer_candidates.append((line[0], abs(width[i][0]), angle))
# 根据线段宽度和位置特征选择最可能的指针线段
if pointer_candidates:
# 按照线段宽度排序,通常指针线段比刻度线宽
pointer_candidates.sort(key=lambda x: x[1], reverse=True)
# 获取最可能的指针线段
best_line = pointer_candidates[0][0]
x1, y1, x2, y2 = best_line
# 确定指针的两个端点,确保一个端点接近圆心
dist1 = np.sqrt((x1-center[0])** 2 + (y1-center[1])** 2)
dist2 = np.sqrt((x2-center[0])** 2 + (y2-center[1])** 2)
if dist1 < dist2:
return [(int(x1), int(y1)), (int(x2), int(y2))]
else:
return [(int(x2), int(y2)), (int(x1), int(y1))]
return None
重难点和创新点
研究难点
在电力指针式仪表自动识读系统的研究和实现过程中,主要面临以下几个难点:
-
复杂背景下的表盘定位:工业现场环境复杂,背景干扰多,表盘可能被部分遮挡或光照不均匀,导致传统的模板匹配方法定位不准确。
-
光照变化的适应性:不同时间、不同地点的光照条件差异很大,可能导致图像对比度低、阴影明显,影响后续的特征提取和识别。
-
指针识别的准确性:指针的形状、颜色、大小等特征各不相同,且可能存在污点、磨损等情况,增加了识别难度。
-
读数计算的通用性:不同类型的仪表刻度分布、量程范围各不相同,需要一种通用的读数计算方法。
-
实时性要求:工业应用对系统的响应速度有较高要求,需要在保证准确性的同时提高处理效率。
技术创新点
针对上述难点,本研究提出了以下创新点:
-
改进的BRISK-FREAK特征匹配算法:
- 结合BRISK特征点检测和FREAK特征描述符,充分利用两者的优势
- 采用KNN+RANSAC的匹配策略,有效消除误匹配
- 实验结果表明,该算法定位成功率达96%,平均耗时2.31秒,优于传统的SIFT、ORB和BRISK算法
-
优化的图像预处理方案:
- 通过对比实验选择最优的图像处理算法组合:加权平均法灰度化、中值滤波去噪、Otsu二值化、Canny边缘检测
- 自适应调整参数,提高对不同光照条件的适应性
-
改进的LSD直线检测算法:
- 设计了基于线段长度、位置、方向和宽度的多特征筛选策略
- 引入线段宽度作为重要的筛选指标,提高指针检测的准确性
- 相比传统的霍夫直线检测,该算法具有更高的检测效率和准确性
-
基于角度法的通用读数计算模型:
- 提出了一种基于指针角度的通用读数计算方法,适用于不同类型的仪表
- 解决了指针指向性判断问题,确保读数计算的正确性
-
人机交互界面设计:
- 基于Tkinter开发了友好的用户界面,支持实时处理和结果可视化
- 提供参数调整、结果保存等功能,增强系统的实用性
实现方案创新
在系统实现方面,本研究也有以下创新点:
-
模块化设计:将系统分为图像获取、表盘定位、图像预处理、指针定位、读数识别、结果输出和用户界面等多个模块,便于维护和扩展。
-
多算法融合:综合运用特征匹配、直线检测、聚类分析等多种算法,优势互补,提高系统的整体性能。
-
自适应参数调整:根据图像的特征自动调整处理参数,减少人工干预,提高系统的智能化水平。
-
实时性能优化:通过算法优化和并行计算,提高系统的处理速度,满足实时监测的需求。
-
鲁棒性设计:针对工业现场的复杂环境,设计了多种异常处理机制,提高系统的稳定性和可靠性。
通过以上创新点,本研究开发的电力指针式仪表自动识读系统在准确性、实时性、通用性和鲁棒性等方面都达到了较高水平,能够满足实际工业应用的需求。
总结
本研究针对电力系统中指针式仪表自动识读的需求,提出了一种基于机器视觉技术的解决方案,主要完成了以下工作:
-
提出了改进的BRISK-FREAK特征匹配算法:结合BRISK特征点检测和FREAK特征描述符,采用KNN+RANSAC的匹配策略,实现了复杂背景下的表盘准确定位。实验结果表明,该算法定位成功率达96%,平均耗时2.31秒,优于传统的SIFT、ORB和BRISK算法。
-
设计了优化的图像预处理方案:通过对比实验选择了最佳的图像处理算法组合(加权平均法灰度化、中值滤波去噪、Otsu二值化、Canny边缘检测),有效提高了图像质量,为后续处理提供了良好的基础。
-
提出了改进的LSD直线检测算法:设计了基于线段长度、位置、方向和宽度的多特征筛选策略,实现了指针的准确检测。相比传统的霍夫直线检测,该算法具有更高的检测效率和准确性。
-
实现了基于角度法的通用读数计算:建立了指针角度与仪表读数之间的映射关系,解决了指针指向性判断问题,实现了不同类型仪表的准确读数。
-
开发了完整的自动识读系统:基于Python和OpenCV开发了具有友好界面的自动识读系统,支持图像获取、处理、识别和结果输出等功能。
未来的研究方向包括:进一步提高系统对污点、磨损等复杂情况的适应能力;研究多指针仪表的识别方法;探索深度学习技术在仪表识别中的应用,进一步提高系统的智能化水平。
参考文献
[1] Rublee E, Rabaud V, Konolige K, et al. ORB: An efficient alternative to SIFT or SURF[C]. 2011 International conference on computer vision, IEEE, 2011: 2564-2571.
[2] Leutenegger S, Chli M, Siegwart R Y. BRISK: binary robust invariant scalable keypoints[C]. 2011 International Conference on Computer Vision, 2011: 2548-2555.
[3] Alahi A, Ortiz R, Vandergheynst P. Freak: fast retina keypoint[C]. 2012 IEEE Conference On Computer Vision And Pattern Recognition, 2012: 510-517.
[4] Von Gioi R G, Jakubowicz J, Morel J M, et al. LSD: A fast line segment detector with a false detection control[J]. IEEE transactions on pattern analysis and machine intelligence, 2008, 32(4): 722-732.
[5] Li H, Qin J, Xiang X, et.al. An efficient image matching algorithm based on adaptive threshold and RANSAC[J]. IEEE Access, 2018, 6: 66963-66971.
[6] Zhang S, Li X, Zong M, et al. Efficient KNN classification with different numbers of nearest neighbors[J]. IEEE Transactions on Neural Networks and Learning Systems, 2018, 29(5): 1774-1785.



被折叠的 条评论
为什么被折叠?



