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

问题描述 投票:15回答:4

我试图从你在高中体育馆找到的典型记分牌中提取数字。我将每个数字都用数字“闹钟”字体,并设法透视正确,阈值并从视频输入中提取给定数字

这是我的模板输入示例

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

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

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

3)cvMatchShapes - 这个很糟糕,它通常无法区分每个输入数字的2位数字

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

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

image-processing opencv computer-vision ocr
4个回答
10
投票

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

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

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

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

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


4
投票

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

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

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


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

© www.soinside.com 2019 - 2024. All rights reserved.