【问题标题】:how get digits recognize from electric meter with minimum libs?如何从具有最小库的电表中识别数字?
【发布时间】:2021-05-18 20:59:22
【问题描述】:

我正在使用 python3 和 kivy 开发一个适用于 android 的应用程序,我想添加一个功能来自动识别来自设备摄像头的电表数字,为此我找到了各种使用 opencv 的解决方案 使用 numpy、mahotas、pytesseract、scipy、scikit_learn 等软件包。

尝试:

https://github.com/VAUTPL/NUMBERS_DETECTION_1
https://github.com/spidgorny/energy-monitor

但是,我需要能够用最少的库有效地实现这一点,因为在使用 buildozer 生成 apk 时,我必须添加所有使用的库,这会生成一个太大的文件,只是为了添加这个功能。

您有什么建议可以用最少的库来实现这个目标?

想法: non-digital

编辑 1: 我需要从仪表数字和非数字中提取数字: digital meter

【问题讨论】:

  • 您可以使用 ABBYY Mobile Capture。如果进行良好的优化,它将花费您大约 20-30 Mb。
  • 但那是在线服务,我需要付费吗?我来自古巴。我需要一个离线和免费的解决方案 xDD,你知道……但是如何将 ABBYY Mobile Capture 与 python kivy 集成?谢谢你的建议
  • 抱歉,我不知道免费 OCR 没有好的解决方案

标签: python opencv kivy ocr


【解决方案1】:

一种方法是将图像处理方法与pytesseract 结合起来。 Python-tesseract 是 Python 的光学字符识别 (OCR) 工具。对于当前示例,您需要执行颜色分割以获取二进制掩码。接下来,您需要使用二进制掩码去除背景,然后使用 tesseract 读取 OCR 数字。

    1. 执行颜色分割:我们将加载的图像转换为 HSV 格式,定义下限/上限范围,并使用cv2.inRange 执行颜色分割以获得二进制掩码。
    1. 提取数字: 获得二进制掩码后,我们将使用它去除背景,并使用cv2.bitwise_and 将数字部分与图像的其余部分分开。算术运算,对于在 hsv 彩色图像中定义 roi 非常有用。
    1. 使用 tesseract 进行 OCR: 我们将 page-segmentation-mode 设置为 6 (see all) 以获得准确的输出。

  • 获取二进制掩码的颜色分割

    • lwr = np.array([43, 0, 71])
      upr = np.array([103, 255, 130])
      hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
      msk = cv2.inRange(hsv, lwr, upr)
      
  • 使用二进制掩码提取数字

    • krn = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 3))
      dlt = cv2.dilate(msk, krn, iterations=5)
      res = 255 - cv2.bitwise_and(dlt, msk)
      
  • OCR

    • 15753 .
      
    • txt = pytesseract.image_to_string(res, config="--psm 6 digits")
      print(txt)
      
    • 如果您想删除 . 或任何其他非字母字符,您可以这样做

    • txt = pytesseract.image_to_string(res, config="--psm 6 digits")
      print(''.join(t for t in txt if t.isalnum()))
      
    • 结果将是15753

代码:


import cv2
import numpy as np
import pytesseract

# Load the image
img = cv2.imread("input.png")

# Color-segmentation to get binary mask
lwr = np.array([43, 0, 71])
upr = np.array([103, 255, 130])
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
msk = cv2.inRange(hsv, lwr, upr)
cv2.imwrite("/Users/ahx/Desktop/msk.png", msk)

# Extract digits
krn = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 3))
dlt = cv2.dilate(msk, krn, iterations=5)
res = 255 - cv2.bitwise_and(dlt, msk)
cv2.imwrite("/Users/ahx/Desktop/res.png", res)

# Displaying digits and OCR
txt = pytesseract.image_to_string(res, config="--psm 6 digits")
print(''.join(t for t in txt if t.isalnum()))
cv2.imshow("res", res)
cv2.waitKey(0)

要查找掩码的上下边界,您可能会发现有用:HSV-Threshold-script *


更新:


如果将相同的技术应用于数字仪表编号,结果将是

【讨论】:

  • 非常感谢您的帮助!这种技术也适用于数字电表号码吗?我用图片编辑帖子...
  • 我已经更新了答案,请参阅 Update-1 下的答案
  • 它对我来说不一样,无论如何我需要建议看看这是否可以用更少的库或更小的包来实现,以免我的 apk 的 python 气泡太大。谢谢
【解决方案2】:

我尝试从网络摄像头拍照,但结果不一样。

print("PRESS 'c' FOR TAKE THE PICTURE")
camara=cv2.VideoCapture(0)
while True:
    (grabacion, img) = camara.read()
    imagen = cv2.resize(img, (200, 120))
    cv2.rectangle(imagen, (xf, rois), (xf+197, rois+50), (0, 255, 0), 2)cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 255, 0), 2)
    cv2.imshow("CAMARA",imagen)
    tecla=cv2.waitKey(1)
    if tecla==ord('c'):
        image=img
        break
    if tecla==ord('x'):
        break

# Color-segmentation to get binary mask
lwr = np.array([43, 0, 71])
upr = np.array([103, 255, 130])
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
msk = cv2.inRange(hsv, lwr, upr)
cv2.imwrite("/home/barcelo/projects-kivy/ocr1/msk.png", msk)

# Extract digits
krn = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 3))
dlt = cv2.dilate(msk, krn, iterations=5)
res = 255 - cv2.bitwise_and(dlt, msk)
cv2.imwrite("/home/barcelo/projects-kivy/ocr1/res.png", res)

# Displaying digits and OCR
txt = pytesseract.image_to_string(res, config="--psm 6 digits")
print(''.join(t for t in txt if t.isalnum()))
cv2.imshow("res", res)
cv2.waitKey(0)

test image

【讨论】:

    【解决方案3】:

    您可以使用数字检测。并使用仪表的显示规则,避免错误字符。最后,您将获得正确的价值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 2017-06-07
      • 2018-08-24
      • 2011-08-11
      • 2020-04-11
      相关资源
      最近更新 更多