计算机视觉中的形状/模式匹配方法

时间:2011-12-27 12:49:36

标签: opencv pattern-matching design-patterns computer-vision vision

在我看来,我目前正面临一个相当普遍的问题,这个问题应该很容易解决,但到目前为止,我的所有接触都失败了所以我转向你寻求帮助。

我认为这个问题最好用一些插图来解释。我有一些这样的模式:

Pattern 1 Pattern 3

我也有一个像(可能更好,因为这张照片来自光线很差的照片):

Picture

(注意模板是如何缩放的,以适应图像的大小)

最终目标是确定用户是否显示拇指向上/向下拇指手势以及两者之间的某些角度的工具。因此,我希望将图案与图像进行匹配,并查看哪一个与图片最相似(或者更准确地说,是手所呈现的角度)。我知道拇指在图案中显示的方向,所以如果我发现看起来相同的图案我也有角度。

我正在使用OpenCV(使用Python Bindings)并且已经尝试过cvMatchTemplate和MatchShapes但是到目前为止它还没有真正可靠地工作。

我只能猜到为什么MatchTemplate会失败,但我认为较小的白色较小的图案完全适合图片的白色区域,因此创造了最佳的匹配因素,尽管很明显它们看起来并不相同。

OpenCV中是否隐藏了一些我尚未发现的方法,或者我是否应该重新实现这类问题的已知算法?

新年快乐。

3 个答案:

答案 0 :(得分:6)

一些简单的技术可以起作用:

  1. 在二值化和分割之后,找到Feret的斑点直径(a.k.a.点之间的最远距离,或主轴)。
  2. 找到点集的凸包,将其填充,并将其视为连接区域。用拇指减去原始图像。差异将是拇指和拳头之间的区域,并且该区域相对于质心的位置应该为您提供旋转的指示。
  3. 对每个点到斑点边缘的距离使用分水岭算法。这有助于识别连接的薄区域(拇指)。
  4. 在blob中拟合最大的圆(或最大的内切多边形)。扩大这个圆或多边形,直到它的一部分边缘与背景重叠。从原始图像中减去这个扩张的图形;只留下拇指。
  5. 如果手的大小一致(或相对一致),那么你也可以进行N形态侵蚀操作,直到拇指消失,然后进行N扩张操作,使拳头恢复到原来的近似大小。从原始斑点中减去这个仅有拳头的斑点以获得拇指斑点。然后使用拇指blob方向(Feret的直径)和/或相对于第一个blob质心的质心来确定方向。
  6. 找到关键点(强方向变化的区域)的技术比较棘手。最简单的方法是,你也可以使用角落探测器,然后检查从一个角落到另一个角落的距离,以确定拇指内缘与拳头相遇的位置。

    对于更复杂的方法,请查看Kimia,Siddiqi和Xiaofing Mi等作者关于形状分解的论文。

答案 1 :(得分:1)

MatchTemplate似乎非常适合您描述的问题。它以什么方式失败了?如果您实际上正如您在样本图像中所显示的那样对拇指竖起/竖起大拇指/竖起大拇指进行掩饰,那么您已经完成了最困难的部分。

MatchTemplate在搜索空间中不包括旋转和缩放,因此您应该在要检测的所有旋转中从参考图像生成更多模板,并且应该缩放模板以匹配找到的拇指的一般大小向上/向下竖起标志。

[编辑] MatchTemplate的结果数组包含一个整数值,用于指定图像中模板在该位置的拟合程度。如果使用CV_TM_SQDIFF,则结果数组中的最小值是最适合的位置,如果使用CV_TM_CCORR或CV_TM_CCOEFF,则它是最高值。如果缩放和旋转的模板图像都具有相同数量的白色像素,则可以比较您为所有不同模板图像找到的最佳拟合值,并且总体上最适合的模板图像是您要选择的模板图像。

有大量的旋转/缩放独立检测功能可以帮助您,但将问题规范化以使用MatchTemplate是最简单的。

有关更高级的内容,请查看SIFTHaar feature based classifiersone of the others available in OpenCV

答案 2 :(得分:1)

如果您只计算最远路径最短的两个点,我认为您可以获得出色的效果。拇指指向的方向只是连接两点的线的方向。

您可以通过在白色区域采样点并使用Floyd-Warshall轻松完成此操作。