4

我正在创建用于从 7 段显示压力计读取值的系统。为了从数字(七段显示器)仪表中检测数字和值,我通过以下链接:

  1. https://hackernoon.com/building-a-gas-pump-scanner-with-opencv-python-ios-116fe6c9ae8b
  2. https://www.pyimagesearch.com/2017/02/13/recognizing-digits-with-opencv-and-python/
  3. https://www.kurokesu.com/main/2017/02/20/dumb-thermometer-gets-digital-output/
  4. https://www.calloftechies.com/2017/12/character-recognition-explained.html

根据上述链接的解释,我创建了以下步骤来阅读数字

  1. 将图像转换为灰度图像。
  2. 使用Otsu 的阈值和二进制逆算法生成二进制图像。
  3. 使用Otsu 的阈值 应用 Canny 边缘检测。
  4. FindContours在 Canny 边缘检测上查找。

这对某些图像效果很好,但是当表盘有一些浅色时,它就不起作用了。

浅色的原始图像。 灰度图像阈值应用图像与 Otsu 和二进制逆原始图像 在此处输入图像描述 在此处输入图像描述

您可以看到 Panel display 部分和 Gauge Area 之间没有太大的色差,因此 Otsu将整个表盘转换为白色忽略 Panel Section

另请参阅以下图像:原始图像、灰度图像和阈值图像。 在此处输入图像描述

在此处输入图像描述

在此处输入图像描述.

请帮我找出矩形 在此先感谢。

4

3 回答 3

2

这是一种使用轮廓近似+轮廓过滤的方法:

  • 将图像转换为灰度并执行 Canny 边缘检测
  • 执行形态关闭
  • 使用轮廓近似查找轮廓和过滤
  • 提取投资回报率

这是检测到的显示

在此处输入图像描述

由于我们已经有了边界框坐标,我们使用 Numpy 切片提取 ROI

在此处输入图像描述

import cv2

image = cv2.imread('1.jpg')
original = image.copy()
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
canny = cv2.Canny(gray, 20, 200, 1)

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
close = cv2.morphologyEx(canny, cv2.MORPH_CLOSE, kernel, iterations=1)
cnts = cv2.findContours(close, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.01 * peri, True)
    area = cv2.contourArea(approx)
    if len(approx) == 4 and area > 1000:
        x,y,w,h = cv2.boundingRect(approx)
        cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 3)
        ROI = original[y:y+h, x:x+w]

cv2.imshow('image', image)
cv2.imshow('ROI', ROI)
cv2.waitKey()
于 2019-11-25T21:40:08.630 回答
1

Otsu 非常擅长找到一个有两个优势强度的良好阈值。但是当它们有三个(白色、灰色、黑色)时,它无法猜测您要分离什么。

如果您在拒绝大部分背景的窗口中应用 Otsu,它会再次正常工作。

在此处输入图像描述

于 2019-11-25T17:21:53.723 回答
0

您可以先使用圆形检测,然后再使用数字检测。得到数字检测的结果后,就可以进行高精度的面积估计。您可以使用 yolo 方法作为检测器。

于 2022-02-26T08:30:17.070 回答