用C#检测摄像机图像中的对象
我有一个从实时网络摄像头拍摄的图像,我希望能够检测图像中的特定对象并提取其中的一部分以进行进一步处理。
具体来说,图像将是一个游戏板,让我们说这个问题的目的是它是一个数独游戏板。
我最初的方法是寻找对比区域,并从那里开始研究,但我似乎最终有很多潜在的边缘(很多错误),并没有真正的线索,如何找出哪些是我真正想要的!
是否有任何算法,库,代码示例,甚至是那些明智的想法,关于我如何寻找和提取图像的相关部分?
使用免费的AForge.Net图像处理库。 有很多很酷的东西可以玩。
您需要在图像上执行滤镜操作和蒙版。
我认为没有简单的方法可以从图像中获取对象,您需要使用边缘检测算法,剪切,并设置有效对象/图像的标准。
您还可以使用图像阈值来检测对象。 您可能需要查看下面的图像处理库。
- filter用于C,C ++,C#,Visual Basic .NET,Delphi,Python的API
- http://www.catenary.com/
- CIMG比上面的库更丰富,但它是用C ++编写的
其中一个(我猜很多可能的)方法:
-
找到一个“获取/计算”给定图像的直线(边缘等)的滤镜。
-
现在你有了所有行的集合(数组)(xStart,yStart和xEnd,yEnd)。 您可以从坐标轻松计算所有线长。
- 现在,考虑到你可以随时(!)期望图像中的“一个最大的正方形/矩形”,很容易找到并计算想要的数独矩形区域并从图像中裁剪它以进一步做处理。
编辑:解决/编程这类问题总是充满挑战,但同时真的很有趣:)。
您可以尝试使用Hough变换 。
我首先使用角落探测器(哈里斯探测器工作得很好)来找到数独网格的交叉点和角落。
然后,我将使用这些点进行图像校正,以转换图像,使网格尽可能为矩形。 现在你应该毫不费力地找到每个方块进行OCR。
图像校正并不简单,需要大量的数学运算。
准备做一些阅读:)
如果游戏板的图像已经接近矩形,您当然可以跳过整流部分并直接使用角点来找到OCR的正方形。
很多人一直建议使用神经网络。 我很确定在这个问题上抛出一个神经网络是完全没必要的。 如果你需要对对象定义含糊不清的对象进行分类,NN(有时)是好的。 “在图像中查找汽车”是一个可以用于神经网络的问题,因为汽车可能看起来非常不同但具有相同的一些function。 因此,如果有足够的数据,您可以训练您的NN来检测汽车。 在这个问题中,你有一些非常规律的东西,看起来几乎一样,所以NN不会让任何事情变得更容易或更好。
使用aforge colorfiltering
为c#提供了许多过滤方法,主要是我更喜欢aforgefilter,为此他们有很少的filter,它们是
* ColorFiltering * ChannelFiltering * HSLFiltering * YCbCrFiltering * EuclideanColorFiltering
看这里
请查看: https : //github.com/dajuric/accord-net-extensions
该库“加入”免费的AForge.NET和Accord.NET库,并添加了图像处理和对象跟踪算法。 样品包括:)
您可以先尝试找到粗线交叉点并将它们用作注册标记。
这将是一个良好的开端,因为:
- 它们的形状非常均匀
- 你知道有多少
- 你知道它们应该在哪里(大致)相互关联
- 可以容忍规模变化
所以:
- 应用边缘filter
- 在图像上扫描理想+应该是什么样的掩模*,记录所有匹配的内容
- 根据相对于彼此的位置,选择最符合您期望的集合
- 您现在也知道数字应该在哪里,这样您就可以轻松地提取它们。
*更复杂的解决方案是使用神经网络而不是掩模来识别交叉点。 这可能是值得的,因为你可能会使用一个用于数字的OCR。
在不拒绝任何其他想法的情况下,第1步应该是检测图像旋转。 您可以通过确定每个点的局部渐变并创建其直方图来完成此操作。 这将有90度偏移的4个主要组件。 理想情况下,这些将是0,90,180和270但如果它们不是你应该旋转你的图像。 例如,在样本图像中,您应该以大约8度CW的旋转开始。
您应该谷歌搜索CamShift或Blob跟踪或粒子filter 。 它们对您的问题都很有用。 其中大部分都附带OpenCV,它是C#包装器AForge.NET。 你会在Youtube上找到一些很好的演示,展示它们是如何工作的。
祝好运