检测图像代表哪个数字

信息处理 数字的 模板匹配
2022-02-03 04:53:38

我每天拍摄我的汽车仪表板以记录工作里程。我使用 OpenCv 来检测数字显示里程的区域,裁剪到数字并匹配它们。我现在用来确定显示哪些数字的方法适用于(比如说)95% 的情况。查找数字工作正常(调整大小、旋转、正确透视)。匹配我觉得仍然有点棘手的数字。

我现在使用的方法是确定构成数字的每个部分/条纹的中心位置,并将中心的差异与预定义的值相匹配。为了找到中心,我使用开放 cv 的 blob 检测。

值为“2”的数字

然后转换为二值图像

前一图像的二值图像

并且blob检测用于找到每个blob的中心(用红色标记)

斑点中心标记为红色的二进制图像

将每个 blob 的中心位置与一组预定义位置的中心位置进行比较(平方距离)。最小二乘距离与数字的条纹有关。然后将找到的条纹组合与包含每个数字的条纹位置的字典进行比较。

我现在遇到的问题是,尽管图像已标准化,但有时会检测到更多的斑点,因为使二进制图像的阈值意外地在斑点的中心遗漏了像素。并且 blob 检测会看到它们是单独的 blob。

有没有更好的方法来确定它使用上面显示的数字的特定显示是什么数字?“更好”将是:更健壮、更简单、所需的逻辑/代码更少、更普遍适用。如果可能的话,我不想为此引入整个 OCR 库。

2个回答

对要识别的图像和十个参考数字的图像之间二进制颜色匹配的像素进行简单计数可能就足够了。

为获得最佳结果,建议使用与目标图像完全相同的方法创建参考图像。

如果事实证明二值化不能重复工作,您可以切换到更精细的比较指标,例如绝对差之和、平方差之和或归一化灰度相关性。

您已经转换为二进制 - 如果证明效果很好,那么您可以进行收缩操作(我很确定 OpenCV 中应该有这样的操作,但不完全),直到每个段得到一个点。测量这些点的坐标,并与一组 7 段显示器的数字模型中的坐标数组进行成对比较。(首先可能需要对坐标进行一些适当的归一化)。

假设您已经测量了坐标的列向量 x_measured 和 y_measured 以及 Octave 中 7 段编号的存储模型的 x_model 和 y_model,那么您可以执行以下操作:

sum(min(abs(x_measured - x_model') + abs(y_measured - y_model')))

在类似 c 的语言中,只有一个双循环存储绝对差之和的最小值,然后对它们求和。

然后你选择与错误最少的数字匹配。


如果您有兴趣,您可能想阅读更多关于数学形态学的内容。如果您看到跳舞情侣的形状,请注意对于高级形状,您可能会从一个连接的形状中获得多个像素。但我认为数字斑点应该足够“好”以防止这种情况发生。