Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 基于OpenCV的记分牌数字识别_Image Processing_Opencv_Computer Vision_Ocr - Fatal编程技术网

Image processing 基于OpenCV的记分牌数字识别

Image processing 基于OpenCV的记分牌数字识别,image-processing,opencv,computer-vision,ocr,Image Processing,Opencv,Computer Vision,Ocr,我试着从一个典型的记分牌中提取数字,你可以在高中体育馆找到。我有一个数字“闹钟”字体的每个数字,并已设法透视校正,阈值和提取一个给定的数字从视频饲料 下面是我的模板输入示例 我的问题是,没有一种分类方法能够准确地确定所有数字0-9。我试过几种方法 1) Tesseract OCR-这一个总是在4上出错,并且经常返回奇怪的结果。只是使用命令行版本。如果我真的尝试在“闹钟”字体上训练它,每次我都会得到未知字符 2) kNearest with OpenCV-我搜索由模板图像(0-9)组成的数据库

我试着从一个典型的记分牌中提取数字,你可以在高中体育馆找到。我有一个数字“闹钟”字体的每个数字,并已设法透视校正,阈值和提取一个给定的数字从视频饲料

下面是我的模板输入示例

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

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

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

3) cvMatchShapes-这一个相当糟糕,它通常无法分辨每个输入数字的2个数字之间的差异

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


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

听起来可能很傻,但你有没有试过简单地在上半部分和下半部分(中心线的左半部分和右半部分)垂直然后水平地检查黑条?

考虑到你输入的高度规则性,您可以定义一组7个要检查的图像目标区域。每个区域应包含显示器每个数字部分7个部分中的某个部分的重要部分,但不得重叠

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


它不像纯ML类型的算法那样优雅,但ML更适合于不规则的输入,在这种情况下,这似乎不适用-因此,您可以用优雅换取准确性。

经典的数字识别,在这种情况下应该可以很好地工作,就是在数字周围裁剪图像,并将其调整为4x4像素

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

使用这些值,训练分类器。SVM是一种很好的支持向量机,在OpenCV中很容易获得

它不像emma或martin建议的那样简单,但它更优雅,而且我认为更健壮


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

如果您尝试使用Tesseract进行文本识别,请尝试传递一个数字,而不是多个重复的数字,有时可以产生更好的结果。
但是,如果您正在规划一个商业软件,您可能需要看看商业OCR SDK。例如,试试看。免费使用应用程序是无法负担的,但当涉及到业务时,它可以为您的产品带来很好的价值。据我所知,ABBYY提供了最好的OCR质量,例如,检查

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

设V表示整数的n元组集

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

(k1,k2,…,kn)

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

如果您可以指定α的范围,那么您只需收集V中与数字对应的向量即可解决问题

我用Martin Beckett的方法应用了这个想法,效果很好。我最初的尝试是通过从左到右的垂直求和简单地注入到2元组中,第一个整数是图像列偏移量,第二个整数是“漂亮”垂直线的长度


这不起作用-6和8的图像将映射到相同的向量。因此,我需要为我的数字输入类型(它们不是记分板)捕获另一个迷你信息,而三元组信息向量就可以做到这一点

我使用了3x5图像(类似于数字显示中的行/列),它与kNearest搜索非常配合。全力以赴。谢谢我为我正在研究的一个问题实现了你的简单想法,效果很好。只需从左侧垂直检查大黑条,同时捕获第一个垂直条的“统计信息”。