我有一张从实时网络摄像头拍摄的图像,我希望能够检测到图像中的特定对象并提取该部分以进行进一步处理。
具体来说,图像将是一个游戏板,假设为了这个问题的目的,它是一个数独游戏板。
我最初的方法是寻找对比区域并从那里解决,但我似乎最终有很多潜在的边缘(很多错误)并且没有真正的线索来确定哪些是我真正想要的!
是否有任何算法、库、代码示例,甚至只是一些聪明的想法,关于我将如何查找和提取图像的相关部分?
我有一张从实时网络摄像头拍摄的图像,我希望能够检测到图像中的特定对象并提取该部分以进行进一步处理。
具体来说,图像将是一个游戏板,假设为了这个问题的目的,它是一个数独游戏板。
我最初的方法是寻找对比区域并从那里解决,但我似乎最终有很多潜在的边缘(很多错误)并且没有真正的线索来确定哪些是我真正想要的!
是否有任何算法、库、代码示例,甚至只是一些聪明的想法,关于我将如何查找和提取图像的相关部分?
为此使用免费的AForge.Net图像处理库。有很多很酷的东西可以玩。
您需要对图像执行过滤器操作和蒙版。
我认为没有简单的方法可以从图像中获取对象,您需要使用边缘检测算法、裁剪并为有效对象/图像设置标准。
您还可以使用图像阈值来检测对象。您可能想查看下面的图像处理库。
一种(我猜可能有很多)方法:
找到从给定图像中“获取/计算”直线(边缘等)的过滤器。
现在您有了所有行(xStart、yStart 和 xEnd、yEnd)的集合(数组)。您可以轻松地从坐标计算所有线长。
编辑:解决/编程这类问题总是具有挑战性,但同时非常有趣:)。
您可以先尝试找到粗线交叉点并将它们用作注册标记。
这将是一个好的开始,因为:
所以:
* 一个更复杂的解决方案是使用神经网络而不是掩码来识别交叉点。这可能是值得的,因为您可能会使用一个作为数字的 OCR。
您可以尝试使用霍夫变换。
我将首先使用角检测器(哈里斯检测器工作得很好)来找到数独网格的交叉点和角点。
然后我会使用这些点进行图像校正,将图像转换为尽可能矩形的网格。现在您应该可以毫不费力地找到每个方块来进行 OCR。
图像校正并不简单,需要大量的数学运算。
准备做一些阅读:)
如果游戏板的图像已经接近矩形,您当然可以跳过校正部分,直接使用角点找到您的正方形进行 OCR。
很多人一直建议使用神经网络。我很确定在这个问题上投入神经网络是完全没有必要的。如果您需要对对象定义模糊的对象进行分类,NN(有时)会很好。“在图像中查找汽车”是一个可以用于神经网络的问题,因为汽车看起来可能非常不同,但具有相同的某些特征。因此,只要有足够的数据,您就可以训练您的 NN 来检测汽车。在这个问题中,你有一些非常规则并且看起来几乎相同的东西,所以 NN 不会让任何事情变得更容易或更好。
在不拒绝任何其他想法的情况下,步骤 1 确实应该是检测图像旋转。您可以通过确定每个点的局部梯度并创建其直方图来做到这一点。这将具有 90 度偏移的 4 个主要组件。理想情况下,这些值为 0、90、180 和 270,但如果不是,您应该旋转图像。例如,在示例图像中,您应该从顺时针旋转约 8 度开始。
使用aforge 滤色
c# 提供了很多过滤方法,主要是我更喜欢 aforge 过滤器,为此它们的过滤器很少,它们是
* ColorFiltering
* ChannelFiltering
* HSLFiltering
* YCbCrFiltering
* EuclideanColorFiltering
看看: https ://github.com/dajuric/accord-net-extensions
该库“加入”了免费的 AForge.NET 和 Accord.NET 库,并添加了图像处理和对象跟踪算法。包括样品:)
你应该用谷歌搜索CamShift或Blob 跟踪或粒子过滤器。它们都对您的问题有用。它们中的大多数都随 OpenCV 一起提供,它是 C# 包装器 AForge.NET。你会在 Youtube 上找到一些很好的演示,展示它们是如何工作的。
祝你好运