【问题标题】:Open Cv - Emgu Cv How to find 7 segment display's rectangle area on gray scaled ImageOpen Cv - Emgu Cv 如何在灰度图像上找到 7 段显示器的矩形区域
【发布时间】:2020-03-20 18:50:34
【问题描述】:

我正在创建用于从 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. 在 Canny 边缘检测上查找 FindContours

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

浅色原图。 灰度图像 使用 Otsu 和二进制逆的阈值应用图像

可以看到Panel之间没有大的色差 显示部分和仪表区域,因此 Otsu 将整个表盘转换为 忽略面板部分发白

另请参阅以下图片:原始、灰度和阈值。

.

请帮我找出矩形 提前致谢。

【问题讨论】:

  • 您是否考虑过不使用 otsus,而是尝试找到适用于您所有情况的固定阈值?
  • @TA:“适用于所有情况的固定阈值”:这永远行不通。
  • @TA : 我曾尝试使用固定阈值,但由于所有图像的光线和角度不同,因此不适用于所有图像。

标签: opencv image-processing ocr emgucv seven-segment-display


【解决方案1】:

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

【讨论】:

    【解决方案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()
    

    【讨论】:

    • 感谢您的回复。我得到了结果,但它只适用于你申请的这张图片,对于其他图片同样的算法不起作用。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      相关资源
      最近更新 更多