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

Nic*_*las 6 opencv design-patterns vision pattern-matching computer-vision

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

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

模式1 模式3

我也有一个像(可能更好,因为这张照片起源于照片很差)这个:

图片

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

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

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

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

是否有一些隐藏在OpenCV中的方法我还没有找到或者是否有一个已知的算法来解决我应该重新实现的那些问题?

新年快乐.

Ret*_*unk 6

一些简单的技术可以工作:

  1. 在二值化和分割之后,找到Feret的斑点直径(也就是点之间或主轴之间的最远距离).
  2. 找到点集的凸包,填充它,并将其视为连接区域.用拇指减去原始图像.不同之处在于拇指和拳头之间的区域,并且该区域相对于质心的位置应该为您提供旋转指示.
  3. 对每个点到斑点边缘的距离使用分水岭算法.这有助于识别连接的薄区域(拇指).
  4. 适合blob中最大的圆(或最大的内切多边形).扩大这个圆或多边形,直到它的一部分边缘与背景重叠.从原始图像中减去这个扩张的图形; 只剩下拇指.
  5. 如果手的大小是一致的(或相对一致),那么你也可以执行N形态侵蚀操作,直到拇指消失,然后N扩张操作使拳头恢复到其原始的近似大小.从原始斑点中减去这个仅有拳头的斑点以获得拇指斑点.然后使用拇指斑点方向(Feret's直径)和/或质心相对于第一个斑点质心来确定方向.

找到关键点(强方向变化的区域)的技术比较棘手.最简单的方法是,你也可以使用角落探测器,然后检查从一个角落到另一个角落的距离,以确定拇指内缘与拳头相遇的位置.

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