当前位置:   article > 正文

YOLOv8+PyQt+OpenCV实现数字式仪表读数和指针式仪表读数识别(二)_yolov 加仪表刻度识别

yolov 加仪表刻度识别

章(一)内容为不同种类仪表识别和数字式仪表读数识别,这一章介绍两种指针式仪表读数识别方法,一种为非360度指针式仪表,一种为360度指针式仪表。效果如下所示。

数字式仪表和两种指针式仪表读数识别

指针式仪表识别效果

360度指针式仪表识别效果

 数字式仪表识别效果

数字式仪表和指针式仪表检测视频

YOLOv8+PyQt+OpenCV+Python实现数字式仪表和两种指针式仪表读数识别

指针式仪表读数识别

检测流程图

采用YOLOv8+OpenCV方式完成指针式仪表的读数,流程图如下。

表盘提取

通过 YOLO 仪表表盘定位算法可以获取到很好的仪表图像,其滤除了复杂的背景, 为接下来的仪表表盘分割操作节省了大量算力。

针对仪表在复杂环境下指针和刻度的轮廓分割问题为了保证提取出来的表盘准确,需要对其进行一定的预处理。对图像进行图像均值迁移模糊处理,使用 pyrMeanShiftFiltering 函数进行图像平滑滤波,以下为效果图。左边为原始图像,右边为经过色彩平滑滤波之后的图像。

由于霍夫圆检测输入图像为灰度图,使用 COLOR_BGR2GRAY 函数转换图片为灰度图像。接着,使用 HoughCircles 函数进行圆形检测,采用霍夫梯度法。这种方法通过计算圆心的累加器阈值来实现检测,在阈值较小的情况下可以检测到更多原本不存在的圆形,而在阈值较大的情况下,则可以检测到更接近完美的圆形。通过这种方法,我们可以检测出表盘,并完成对表盘的提取。左边为灰度图,右边为提取表盘图。

指针及圆心提取

为了保证提取出来的指针及圆心准确,首先,利用霍夫圆检测截取表盘区域并得到表盘中心点的坐标,但此时中心点与真正中心点有较大的误差,需要进一步优化。

然后对滤除背景的表盘进行高斯滤波,再转为灰度图并进行二值化操作。高斯滤波器能够对周围像素点的灰度值进行控制,从而降低噪音的影响。使用高斯滤波对图像处理之后,要先将图像转化为灰度图,再对图像进行二值化处理,以便提取指针及圆心。下图为经过高斯滤波和灰度变换之后的图像。左图为经过高斯滤波之后图像,右图为经过灰度变换之后图像。

为了寻找表盘图像中的轮廓,使用 opencv 中的 findContours 函数。该函数可以定位指针和刻度线的轮廓,从而在二值化图像中找到轮廓并返回它们的列表和层次结构。根据轮廓中心点到使用霍夫圆检测出的表盘中心点的距离筛选出指针轮廓和刻度线轮廓,再将轮廓拟合成直线,完成对刻度线的检测。在得到所有刻度线后,将它们两两延长,获取所有交点,计算所有交点的 x 坐标和 y 坐标的平均值,这个平均值即为优化过后的表盘中心点坐标。得到各个轮廓中心点坐标(xi,yi)则有各个轮廓中心点到表盘中心点的距离di满足:

与识别表盘中心点初始步骤相同,筛选出指针轮廓后,得到指针轮廓中心点坐标 ( xi, yi) ,针对指针轮廓图像使用概率霍夫线变换函数检测图像中的直线,筛选出最长直线段,得到直线段两端的端点 ,计算直线段两端点与表盘中心点的距离,即

若 d1>d2 ,则指针端点为(xp1, yp1),否则指针端点为(xp2, yp2)。下图为经过二值化之后的图像及检测的结果。左图为经过二值化之后图像,右图为检测指针端点及表盘圆心。

初始刻度和结束刻度检测数据集

标签选择为“Start Scale”和“End Scale”,部分数据集如下所示。训练部分比较基础不再展示。

检测方法及读数思路

检测方法为角度法,即通过计算指针与指针式仪表刻度盘之间的夹角来确定指针所指向的刻度。其主要原理是利用指针与零刻度以及结束刻度的夹角,根据夹角占比计算指针的位置,进而读取刻度值。下图为角度法原理图。

思路主要是通过YOLOv8检测出的目标框位置信息data,对data最后一列即类别列进行排序,再获取其目标值第一列和第三列即为开始刻度线或结束刻度线的x坐标,第二列和第四列即为开始或结束刻度线的y坐标,即获得表盘开始刻度线和结束刻度线的坐标。

设 0 刻度线中心点、圆心、指针端点、结束刻度线中心点分别为 P1、 P2、P3、P4,通过指针端点坐标、圆心坐标和 0 刻度线中心坐标计算 0 刻度线和指针所成的夹角,然后通过 0 刻度线中心坐标、圆心坐标、结束刻度线中心坐标计算 0 刻度线和终止刻度线所成夹角,通过两个夹角的占比再乘以仪表的量程即为指针式仪表的读数。以计算 0 刻度和指针所成角度为例:

PyQt界面

界面包括导入图片、开始检测、确认读数、修改读数、结果显示(包括当前时间、读数结果)、清除数据等操作,读数结果会保存在相应txt文件中,如下所示。其中确认读数会在文件中追加并显示"The reading is correct.",修改读数会自动读取模型的检测结果,修改后在文件中追加并显示"The corrected reading is:XXX"。以下为检测结果和程序界面。

360度指针式仪表读数识别

数据集

部分数据集如下所示。训练部分比较基础不再展示。

读数思路

与上个指针式仪表思路类似,通过YOLOv8检测出的目标框位置信息data,但不用再排序了,因为只有一行即0刻度线,随后再获取目标框的第一列和第三列,相加除以2即为目标框中心点的x坐标,第二列和第四列相加除以2即为目标框中心点的y坐标,即将检测框中心点(矩形对角线的交点)作为0刻线的坐标,随后与之前相同,运用角度法完成最终读数。

PyQt界面

界面包括导入图片、开始检测、确认读数、修改读数、结果显示(包括当前时间、读数结果)、清除数据等操作,读数结果会保存在相应txt文件中,如下所示。其中确认读数会在文件中追加并显示"The reading is correct.",修改读数会自动读取模型的检测结果,修改后在文件中追加并显示"The corrected reading is:XXX"。以下为检测结果和程序界面。

总结心得

针对不同规格的仪器仪表进行图像识别检测。首先,针对图像数据集中存在的倾斜图像,采用透视变换进行校正。接着,使用 LabelImg 软件对这些图像进行标注,并采取了缩放、裁剪和旋转等方式进行数据增强。然后介绍了 YOLO模型,并进行模型训练及评估,通过测试集验证了训练结果的有效性,完成对不同规格的仪器仪表的识别。

针对数字式仪器仪表完成图像识别读数。根据上述对不同仪表识别训练好的模型对数据集进行图像分割,检测出表盘区域并将其裁剪保存,完成对数字式仪表数据集的构建。然后针对数字式仪器仪表,采用YOLO目标检测算法来检测和定位仪表的表盘。使用 s、m、l、x 四种不同模型进行训练,并对结果进行分析。在 x 模型中加入注意力机制,对结果进行了分析和比较,实现对多个数字的识别和读数,同时确保数字检测的精度与效率,通过测试集对置信度水平、精确率以及召回率等训练结果进行验证,将检测到的数据结果显示在PyQt界面并保存。

针对指针式仪器仪表完成图像识别读数。根据模型检测出表盘区域并将其裁剪保存,完成数据集的构建,然后基于YOLO目标检测算法检测识别出表盘零刻度线和结束刻度线的位置,同时利用图像处理技术如霍夫圆检测等裁剪出表盘区域,然后运用高斯滤波、二值化等算法对仪表的刻度线、指针和圆心进行提取拟合,利用角度法完成对指针式仪表的读数,并将结果显示在PyQt 界面并保存。

还有很多待改进的地方,有时候指针式仪表检测效果还不是很准确,但作为毕设应该是足够的,也欢迎大家一起交流学习,有什么问题可以留言或者私信我,能解答的会一一回复。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/289722
推荐阅读
相关标签
  

闽ICP备14008679号