2011-11-09 134 views
15

我想从一个典型的记分牌中提取数字,你会发现在高中健身房。我有一个数字“闹钟”字型每个数字和设法透视校正,阈值和从视频源使用OpenCV记分牌数字识别

Sample input

这里提取一个给定的数字是我的模板输入的样本

Template input

我的问题是没有一个分类方法会准确确定所有数字0-9。我已经尝试了几种方法

1)Tesseract OCR - 这一个一直在4上搞砸,并经常返回奇怪的结果。只需使用命令行版本。如果我真的试图用“闹钟”字体来训练它,我每次都会得到未知的角色。

2)k最接近OpenCV - 我搜索一个由我的模板图像(0-9)组成的数据库,并查看哪一个数据库最近。我经常得到混乱3/1和7/1之间

3)cvMatchShapes - 这是一个相当糟糕的,它通常不能告诉的数字2之差为每个输入数字

4)切线距离 - 这是最接近的,但输入和我的模板之间的最小切线距离结束映射“7”到“1”每次

我真的很茫然,得到这样一个分类算法简单的问题。我觉得我已经很好地清理了输入,对于分类来说这是一个相当简单的例子,但我无法获得足够可靠的任何实际应用。任何关于在哪里寻找分类算法,或如何正确使用它们的想法,将不胜感激。我没有清理输入吗?更好的输入数据库呢?我不知道我还会用什么来输入,每个数字和模板在这一点上看起来都很有用。

回答

9

经典的数字识别(在这种情况下应该可以很好地工作)是在图像的周围裁剪图像,将其大小调整为4x4像素,最后应用dct进一步缩小搜索空间(然后,您可以选择前4-6个值)。用这些价值观来训练一个分类器。 SVM是一个很好的例子,可以在OpenCV中使用。

它不像艾玛或马丁的建议那么简单,但更优雅,我认为,更强大。

编辑

鉴于你输入的宽/高比,您可以选择一些不同的小分辨率。如3x4

+0

我使用了3x5图像(类似于数字显示中的行/列),它在k最近搜索时效果很好。死了。谢谢! – pyromanfo

+0

很高兴听到!继续! – Sam

3

听起来可能听起来很愚蠢,但是您是否尝试过直接检查黑色条,然后水平地在顶部和底部半部 - 中心线的左侧和右侧进行检查?

3

鉴于输入的高度规律性,您可以定义一组要检查的图像的7个目标区域。每个区域应该包含显示器每个数字的7段中的一段的重要部分,但不重叠。

然后,您可以检查每个区域并平均像素的颜色/亮度以生成给定二进制状态的概率。如果你在所有领域的可能性很高,你可以很容易地找出数字是什么。

它不像纯粹的ML型算法那么优雅,但ML更适合于不规则的输入,在这种情况下似乎并不适用 - 所以您为了准确性而交易优雅。

2

如果您尝试使用Tesseract进行文本识别,请尝试传递未输入一位数字,但输入一些重复的数字,有时可能会产生更好的结果,here's the example。 但是,如果您计划使用商业软件,则可能需要查看商业OCR SDK。例如,尝试ABBYY FineReader Engine。免费使用应用程序并不便宜,但对于商业来说,它可以为您的产品带来很好的价值。据我所知,ABBYY提供了最好的OCR质量,例如检出http://www.splitbrain.org/blog/2010-06/15-linux_ocr_software_comparison