骰子面值识别

时间:2010-04-08 02:56:22

标签: c# .net opencv image-recognition emgucv

我正在尝试构建一个能够识别两个6面骰子值的简单应用程序。我正在寻找一些通用指针,甚至可能是一个开源项目。

两个骰子将分别为黑色和白色,分别为白色和黑色。它们与相机的距离将始终相同,但它们在比赛场地上的位置和方向将是随机的。

Dice http://www.freeimagehosting.net/uploads/9160bdd073.jpg
(不是最好的例子,表面将是更鲜明的颜色,阴影将会消失)

我没有开发这种识别软件的经验,但我认为诀窍是首先通过搜索具有主导白色或黑色的方形轮廓来隔离面部(图像的其余部分,即桌子/比赛场地,将以明显不同的颜色),然后隔离点数计数。自顶向下照明将消除阴影。

我希望所描述的场景如此简单(阅读:常见)它甚至可以用作开发OCR技术或类似计算机视觉挑战的开发人员的“介绍性练习”。

更新

我做了一些进一步的谷歌搜索并遇到this video奇怪的是 完全 我正在寻找的东西。到目前为止,似乎OpenCV project是我最好的选择,我会尝试将其用于此other project, OpenCVDotNetEmgu CV

更新
仍在苦苦挣扎,无法让Emgu CV工作。

想法,指针,想法等仍然非常受欢迎!

7 个答案:

答案 0 :(得分:9)

虽然图像培训是“非平凡的”,正如@Brian所说,这实际上是一个非常容易编写的程序。你需要做的是为骰子开发haar分类器。总共需要6个分类器。分类器是良好图像识别的关键,哈尔分类器是目前最好的。他们需要很长时间才能完成。这里有一些很好的链接让你熟悉haar级联:

http://www.computer-vision-software.com/blog/2009/11/faq-opencv-haartraining/

http://www.cognotics.com/opencv/docs/1.0/haartraining.htm

http://note.sonots.com/SciSoftware/haartraining.html

查看这些人youtube视频,然后从他在视频中提供的链接下载他的来源,看看他如何在EmguCV中应用级联文件。这将是你的基础。

http://www.youtube.com/watch?v=07QAhRJmcKQ

这个网站发布链接到一些来源的漂亮的小工具,增加了一点自动化来裁剪图像和创建haar级联创建所需的索引文件。几个月前我用它了,我无法让它正常工作,但我修改了它,它对haar(不是HMM)很有用。如果你想要我修改的版本回发,我会把它给你。

http://sandarenu.blogspot.com/2009/03/opencv-haar-training-resources.html

答案 1 :(得分:3)

虽然我很少向您提供技术帮助,但Dice-O-Matic mark II的制作人可能会提供帮助。

答案 2 :(得分:3)

好的,

用于执行具有高抽象水平的图像识别的算法(如产生可靠的手写识别软件或面部识别软件所必需的抽象类型)仍然是当今计算机科学中最困难的问题之一。但是,对于受限制的应用程序(如您所描述的应用程序)的模式识别,这是一个可解决且非常有趣的算法问题。

我会建议两种可能的策略来执行你的任务:

第一个策略涉及使用一些第三方软件,它可以预处理您的图像并返回有关低级图像组件的数据。我有一些使用名为pixcavator的软件的经验,该软件具有SDK here。 Pixavator将挖掘您的图像并研究每个像素的颜色值之间的差异,以返回图像中各种组件的边界。像pixcavator这样的软件应该能够轻松定义图片中的comopents的边界,最重要的是每个点子。然后,您的工作将通过第三方软件返回给您的数据进行挖掘,并查找符合白色或黑色小圆形分区描述的组件。您将能够计算出这些图像组件中有多少被分区,并使用它来返回图像中的点数。

如果你有足够的雄心在不使用第三方软件的情况下解决这个问题,那么这个问题仍然是可以解决的。基本上,你需要定义一个圆形扫描仪,它是一个圆形结构的像素集,它将扫描你的图像测试寻找一个点(就像一只眼睛可能扫描一张图片来寻找隐藏在图片中的东西) )。当您的算法“眼睛”扫描图像时,它将从图像中获取像素集(称为测试集)并与预定义的像素集(我们称之为训练集)进行比较并检查以查看如果测试集与预定义误差范围内的一个训练集匹配。运行这样的测试的最简单方法是简单地将测试集中每个像素的颜色数据与训练集中的每个像素进行比较,以生成称为差异集的第三组像素。如果差异集中的值足够小(意味着测试集与训练集足够相似),则将图像上的区域定义为点,然后继续扫描图像的其他部分。

需要一点猜测并检查以找到正确的容错,以便你抓住每个点,而你不会对非点数的东西测试为正。

答案 3 :(得分:2)

图像识别非常重要。你将不得不以某种方式限制输入数据,看起来你已经考虑过了。

你的问题让我想起了一个blog post by the author of SudokuGrab,这是一款iPhone应用程序,可让你在报纸上拍摄数独谜题的照片,让它为你解决难题。在帖子中,他讨论了在解决问题时将面临的几个问题,以及他如何克服这些问题。

答案 4 :(得分:2)

这是Object Recognition from Templates的一个熟悉的问题,我提供了一个我认为可能有用的答案。

虽然不同类型的分类器可能会运行良好,但我可能会尝试我首先概述的方法。分类器通常很难实现,特别是要正确训练。 此外,当事情不起作用时,很难知道问题出在哪里:是你的分类器实现,你选择了错误的方法,参数是错误的,你没有正确训练,还是你只是运气不好?

不,如果使用simlpe图像处理方法和一些数学可以(轻松)解决问题,请远离分类器,模板匹配和神经网络。

答案 5 :(得分:1)

另一种可能性是首先使用更通用的图像处理/识别算法来固定骰子位置,然后旋转并将图像缩放到某种形式的标准(例如,旋转为骰子的512x512像素灰度图像直行)。然后尝试训练6个不同的神经网络来识别屏幕上各种数量的骰子。 AForge.Net是一个很好的可靠的人工智能(包括神经网络)库,应该会让你有一个相当的方式。

答案 6 :(得分:0)

this video中,您可以看到您想要的行为。作者正在使用多个白色骰子,但他正在提供代码(python / opencv),也许你可以在其上构建你的项目。