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

Posted

技术标签:

【中文标题】计算机视觉中的形状/模式匹配方法【英文标题】:Shape/Pattern Matching Approach in Computer Vision 【发布时间】:2012-01-28 12:17:21 【问题描述】:

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

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

我还有一张类似这样的图片(可能更好,因为这张照片的来源照片光线很差):

(注意模板是如何缩放到适合图像大小的)

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

我正在使用 OpenCV(使用 Python 绑定)并且已经尝试过 cvMatchTemplate 和 MatchShapes,但到目前为止它并不能真正可靠地工作。

我只能猜测 MatchTemplate 失败的原因,但我认为带有较小白色的较小图案完全适合图片的白色区域,从而创建最佳匹配因子,尽管它们看起来并不完全相同。

p>

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

新年快乐。

【问题讨论】:

【参考方案1】:

一些简单的技术可以奏效:

    二值化和分割后,找到 Feret 的 blob 直径(也称为点之间的最远距离,或长轴)。 找到点集的凸包,对其进行泛洪填充,并将其视为连接区域。用拇指减去原始图像。不同之处在于拇指和拳头之间的区域,该区域相对于重心的位置应该可以为您提供旋转指示。 对每个点到斑点边缘的距离使用分水岭算法。这可以帮助识别连接的薄区域(拇指)。 将最大的圆(或最大的内接多边形)拟合到 blob 中。扩大这个圆形或多边形,直到其边缘的一部分与背景重叠。从原始图像中减去这个膨胀的图形;只会留下拇指。 如果手的大小一致(或相对一致),那么您还可以执行 N 次形态腐蚀操作,直到拇指消失,然后进行 N 次扩张操作以使拳头恢复到其原始近似大小。从原始 blob 中减去这个只有拳头的 blob 以获得拇指 blob。然后使用拇指斑点方向(费雷特直径)和/或相对于拳头斑点质心的质心来确定方向。

寻找临界点(方向变化强烈的区域)的技术比较棘手。最简单的情况是,您也可以使用角检测器,然后检查一个角到另一个角的距离,以确定拇指内缘与拳头相交的位置。

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

【讨论】:

【参考方案2】:

MatchTemplate 似乎很适合您描述的问题。它以什么方式对您不利?如果您实际上像在示例图像中显示的那样很好地掩盖了竖起大拇指/大拇指向下/中间大拇指标志,那么您已经完成了最困难的部分。

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

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

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

如需更高级的内容,请查看SIFT、Haar feature based classifiers 或one of the others available in OpenCV

【讨论】:

是的,提供的图片是原始图片。例如,与示例图像相比,第二个图案图像没有最佳匹配值。即使它们的大小与图像中的大小几乎相同。您是否推荐一种特殊的匹配模板方法(CV_TM_SQDIFF,...)?我得到的价值是什么?整张照片出错?每个像素的距离(所以我必须将它除以图像大小或类似的东西?) 对于拳头等“有弹性”的形状,匹配模板可能并不总是如您所愿。旋转、缩放和仿射变换一起不考虑单个组件的分段旋转和拉伸。如果形态学和分割技术的组合不起作用,那么考虑搜索关于“形状分解”的论文。【参考方案3】:

我认为如果你只计算通过白色的最短路径的两个点,你可以获得很好的结果。拇指指向的方向就是连接两点的线的方向。

您可以通过在白色区域上采样点并使用Floyd-Warshall 轻松做到这一点。

【讨论】:

这听起来像是一个有趣的方法,但您能否进一步详细说明?我不明白您所说的“在白色区域上采样点”是什么意思,以及如何使用这种图形算法来解决我们的问题 查看这篇论文,它很好地描述了该技术:Ling 和 Jacobs 的“Shape Classification Using the Inner-Distance” www.cs.umd.edu/~djacobs/pubs_files/ID-pami-8 .pdf

以上是关于计算机视觉中的形状/模式匹配方法的主要内容,如果未能解决你的问题,请参考以下文章

特征检测和特征匹配方法

如何使用计算机视觉在图像中找到形状?

基于计算机视觉的实时摄像头形状距离计算

计算机视觉——图像匹配

计算机视觉经典书籍推荐

OpenCV探索之路(二十三):特征检测和特征匹配方法汇总