使用OpenCV进行记分牌数字识别

时间:2011-11-09 19:16:57

标签: image-processing opencv computer-vision ocr

我正在尝试从您在高中体育馆找到的典型记分牌中提取数字。我有一个数字“闹钟”字体的每个数字,并设法透视正确,阈值和从视频提取中提取给定数字

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”

我真的很难为这样一个简单的问题得到一个分类算法。我觉得我已经很好地清理了输入,这是一个相当简单的分类案例,但我无法获得足够可靠的实际用途。任何有关在何处查找分类算法或如何正确使用它们的想法都将受到赞赏。我没有清理输入吗?那个更好的输入数据库怎么样?我不知道还有什么用于输入,此时每个数字和模板看起来都是正确的。

5 个答案:

答案 0 :(得分:10)

在这种情况下应该运行良好的经典数字识别是在图像周围裁剪图像并将其调整为4x4像素。

离散余弦变换(DCT)可用于进一步缩小搜索空间。您可以选择前4-6个值。

使用这些值,训练分类器。 SVM是一个很好的,在OpenCV中很容易获得。

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

考虑到输入的宽高比,您可以选择不同的分辨率,例如3x4。选择保留可读数字的最小的一个。

答案 1 :(得分:4)

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

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

它不像纯ML类型算法那么优雅,但是ML更适合于不常规的输入,并且在这种情况下似乎并不适用 - 所以你交换优雅的准确性。 / p>

答案 2 :(得分:3)

可能听起来很傻但你是否尝试过垂直检查黑条,然后在上半部分和下半部分水平检查 - 中心线的左右两侧?

答案 3 :(得分: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

答案 4 :(得分:0)

您希望记分卡图像输入S提供一种算法,将其映射到{0,1,2,3,4,5,6,7,8,9}。

让V表示整数n元组的集合。

构造将每个图像S映射到n元组的算法α

(k 1 ,k 2 ,...,k n

可以区分两个不同的记分牌数字。

如果可以指定α的范围,则只需要收集V中与一个数字相对应的向量即可。

我已经使用了马丁·贝克特(Martin Beckett)的idea来应用了这个想法,并且效果很好。我最初的尝试是通过从左到右的垂直垂直求和简单地注入2元组,第一个整数是图像列偏移量,第二个整数是“好的”垂直线的长度。

这不起作用-6和8的图像将映射到相同的向量。因此,对于我的数字输入类型(它们不是记分板),我需要另一个 mini-info-capture ,而三元组的信息向量可以解决问题。