基于opencv的指针式仪表的识别与读数

对于指针式仪表的识别与读数,可以通过以下步骤使用OpenCV实现

  • 读取图像:使用cv2.imread()函数读取要处理的仪表图像。
    在这里插入图片描述

  • 灰度转换:使用cv2.cvtColor()函数将彩色图像转换为灰度图像。这是因为灰度图像只有一个通道,便于后续的处理。

  • 平滑滤波:为了去除噪声,可以使用中值滤波或高斯滤波。中值滤波通过将每个像素替换为其邻域像素的中值来消除噪声。高斯滤波则是通过计算像素周围邻域像素的加权平均值来平滑图像。你可以根据实际情况选择适合的滤波方法,例如使用cv2.medianBlur()进行中值滤波或使用cv2.GaussianBlur()进行高斯滤波。对于指针式仪表的识别与读数,可以通过以下步骤使用OpenCV实现:

  • 读取图像:使用cv2.imread()函数读取要处理的仪表图像。

  • 灰度转换:使用cv2.cvtColor()函数将彩色图像转换为灰度图像。这是因为灰度图像只有一个通道,便于后续的处理。
    在这里插入图片描述

  • 平滑滤波:为了去除噪声,可以使用中值滤波或高斯滤波。中值滤波通过将每个像素替换为其邻域像素的中值来消除噪声。高斯滤波则是通过计算像素周围邻域像素的加权平均值来平滑图像。你可以根据实际情况选择适合的滤波方法,例如使用cv2.medianBlur()进行中值滤波或使用cv2.GaussianBlur()进行高斯滤波。

  • 边缘检测:使用Canny边缘检测算法来检测图像中的边缘。Canny边缘检测算法首先使用Sobel算子计算图像的梯度强度和方向,然后通过非最大抑制和双阈值处理来提取出真正的边缘。使用cv2.Canny()函数可以方便地进行Canny边缘检测,你可以根据实际情况调整阈值参数。

  • 轮廓提取:使用cv2.findContours()函数来提取边缘图像中的轮廓。轮廓是连续的曲线,可以用来表示物体的形状。通过设置适当的参数,可以选择性地提取出仪表盘的指针轮廓。

  • 指针识别:对于仪表指针,通常可以通过以下特征进行识别:

  • 面积大小:指针通常具有相对较大的面积。

  • 形状:指针通常是细长的形状,可以通过检查轮廓的形状来判断是否为指针。

  • 位置:指针通常位于仪表盘中心附近。

    可以遍历提取到的轮廓,根据以上特征来筛选出指针轮廓。

  • 读数计算:对于选定的指针轮廓,可以通过计算指针与仪表盘中心之间的夹角来得到仪表的读数。可以使用cv2.minEnclosingCircle()函数找到指针的中心点,然后计算指针中心点与仪表盘中心点之间的夹角。

以上就是通过OpenCV对指针式仪表进行读数的一般步骤。根据实际情况,你可能需要调整参数、采取不同的滤波方法或添加其他处理步骤来适应不同的仪表图像。
在这里插入图片描述

  1. 边缘检测:使用Canny边缘检测算法来检测图像中的边缘。Canny边缘检测算法首先使用Sobel算子计算图像的梯度强度和方向,然后通过非最大抑制和双阈值处理来提取出真正的边缘。使用cv2.Canny()函数可以方便地进行Canny边缘检测,你可以根据实际情况调整阈值参数。

  2. 轮廓提取:使用cv2.findContours()函数来提取边缘图像中的轮廓。轮廓是连续的曲线,可以用来表示物体的形状。通过设置适当的参数,可以选择性地提取出仪表盘的指针轮廓。

  3. 指针识别:对于仪表指针,通常可以通过以下特征进行识别:

    • 面积大小:指针通常具有相对较大的面积。
    • 形状:指针通常是细长的形状,可以通过检查轮廓的形状来判断是否为指针。
    • 位置:指针通常位于仪表盘中心附近。

    可以遍历提取到的轮廓,根据以上特征来筛选出指针轮廓。

  4. 读数计算:对于选定的指针轮廓,可以通过计算指针与仪表盘中心之间的夹角来得到仪表的读数。可以使用cv2.minEnclosingCircle()函数找到指针的中心点,然后计算指针中心点与仪表盘中心点之间的夹角。

结果展示

可以看出下图给出了角度值,通过圆盘的固定尺度的丈量,就可以自动化推理出,指数是多少。

在这里插入图片描述

代码与总结

要基于OpenCV对指针式仪表进行读数,可以采用以下步骤:

  • 读取图像:使用cv2.imread()函数读取图像文件,或从摄像头中实时获取图像。
  • 图像预处理:对图像进行预处理,以便提取出仪表盘的指针和刻度线等关键部分。例如,可以使用cv2.cvtColor()函数将图像转换为灰度图像,然后使用cv2.GaussianBlur()函数进行高斯模糊,以去除噪声。
  • 提取特征:使用OpenCV的特征提取算法,如Canny边缘检测、Hough变换等,找到仪表盘的指针和刻度线等关键部分。
  • 计算角度:通过计算指针与刻度线之间的夹角,即可得到仪表的读数。可以使用cv2.minEnclosingCircle()函数找到指针的中心点,然后计算指针中心点与仪表盘中心点之间的夹角。
  • 显示结果:将读数显示在图像上,并将图像显示出来或保存为文本
import cv2
import numpy as np

# 读取图像
img = cv2.imread('meter.jpg')

# 图像预处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)

# 提取特征
edges = cv2.Canny(blur, 50, 200, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi/180, 100)

# 找到指针和刻度线
for line in lines:
    rho, theta = line[0]
    if theta < np.pi/4 or theta > 3*np.pi/4:
        x0 = np.cos(theta) * rho
        y0 = np.sin(theta) * rho
        pt1 = (int(x0 + 1000*(-np.sin(theta))), int(y0 + 1000*np.cos(theta)))
        pt2 = (int(x0 - 1000*(-np.sin(theta))), int(y0 - 1000*np.cos(theta)))
        cv2.line(img, pt1, pt2, (0, 0, 255), 3)

# 计算角度
center = (img.shape[1]//2, img.shape[0]//2)

最后

#联系qq1309399183
OpenCV是一个强大的计算机视觉库,可以用于图像处理和分析。要使用指针式仪表盘读取功能,需要以下步骤: 1. 加载图像:使用OpenCV函数读取仪表盘图像并将其存储为Mat对象。 2. 预处理图像:使用图像处理技术,如灰度转换、平滑和二值化,以便更好地识别仪表盘指针。 3. 检测指针:使用霍夫变换检测仪表盘指针。这将返回指针的位置和角度。 4. 计算度数:根据指针的位置和角度计算出指针所指示的度数。 下面是一个使用OpenCV进行指针式仪表盘读取的示例代码: ```python import cv2 import math # 读取图像 img = cv2.imread('dashboard.jpg') # 灰度转换 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 平滑处理 blur = cv2.GaussianBlur(gray, (5, 5), 0) # 二值化 ret, thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 检测圆形轮廓 circles = cv2.HoughCircles(thresh, cv2.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0) # 获取圆形轮廓 if circles is not None: circles = np.round(circles[0, :]).astype('int') for (x, y, r) in circles: # 绘制圆形轮廓 cv2.circle(img, (x, y), r, (0, 255, 0), 2) # 获取指针位置 pointer_x = int(x + r * math.cos(math.radians(-90))) pointer_y = int(y - r * math.sin(math.radians(-90))) # 绘制指针 cv2.line(img, (x, y), (pointer_x, pointer_y), (0, 0, 255), 2) # 计算度数 degree = int((math.atan2(y - pointer_y, pointer_x - x) * 180 / math.pi) + 180) print('degree:', degree) cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个示例中,我们首先读取了指针式仪表盘的图像,然后使用OpenCV函数对其进行了预处理和检测。最后,我们计算了指针所指示的度数,并将其打印出来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿利同学

一角两角不嫌少

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值