一种启发式捕获水龙头上的数字

时间:2017-06-21 20:51:39

标签: opencv opencv3.0 opencv-contour

有人可以通过OpenCV与我分享关于启发式捕获数字的计数器的想法吗?我有一个带有不同水计数器的图像数据集(如下图所示),任务是识别它上面的数字(表示水消失了多少:在这个图像中这些是 - 0 0 0 0 1 0 2 5 )

enter image description here

我看到的第一项任务是以某种方式捕捉数字所在的轮廓。从我到目前为止的尝试来看,最好的轮廓发现策略是使用Canny边缘检测器后跟cv2.findContours方法最简单的:

import imutils
import cv2
import numpy as np
import argparse
import glob

image = cv2.imread("watercounter.jpg")
image = imutils.resize(image, height=500)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (3, 3), 0)
edged = cv2.Canny(blurred, 100, 1, 255, apertureSize=3)

cnts = cv2.findContours(edged.copy(), cv2.RETR_LIST,
                    cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)

cv2.drawContours(image, cnts, -1, (0, 255, 0), 3)
cv2.imshow("output", image)

这种方法输出以下图像,现在我正在考虑使用启发式来区分数字轮廓与其他所有轮廓,我可以进一步将它们提供给标准数字识别技术。非常感谢您的想法。

a heuristic to capture numbers on a watercounter

1 个答案:

答案 0 :(得分:1)

摆脱不必要轮廓的一种方法是使用HoughCircles和HoughLines。使用Hough圆圈,您可以识别仪表的内部区域。 HoughLines将使用数字突出显示矩形,允许您将其与其余部分分开。

This是一个使用KNN进行数字识别的教程。

我不确定使用轮廓是否是数字识别的最佳方法,因为对于大多数数字,您会发现内部轮廓和外部轮廓。训练Haar分类器(搜索" OpenCV HaarTraining示例")将产生更好的结果。