使用OpenCV中的SURF进行模式识别的准确性度量

3
我目前正在使用OpenCV中的SURF进行模式识别。我已经撰写了一个C#程序,可以选择源图像和想要查找的模板。然后,我将这两个图片传输到一个实现了OpenCV-SURFdetector的C++-dll中,在那里返回所有关键点和匹配到我的C#程序,我试图在匹配周围画一个矩形。
现在我的问题是:在模式识别中是否有一种常见的精度测量方法?比如说,与模板关键点的数量成比例的匹配数?或者我的匹配矩形与原始模板图像的大小差异?哪些常见参数用于确定匹配是否是“真实”和“好”的匹配?
编辑:为了让我的问题更清晰。我有一堆匹配点,已经通过minHessian和距离值阈值处理了。之后,我会像您在图片中看到的那样在我的匹配点周围画一个矩形。这就是我的“匹配”。现在我该如何判断这个匹配有多好?我已经计算了我现在找到的匹配和我的模板之间的角度、大小和颜色差异。但我认为这还不够具体。
3个回答

3
我不太确定你在询问什么,因为你所说的“匹配”是模糊的。但由于你已经匹配了你的SURF点,并提到了模式识别和使用模板,我假设,最终,你想在图像中定位模板,并且你正在询问一个本地化得分来决定是否找到了图像中的模板。
这是一个具有挑战性的问题,我不知道是否已经找到了一个好的并且总是适用的解决方案。
然而,根据你的方法,你可以分析图像中匹配点的密度:考虑局部或全局极值作为你的模板可能的位置(如果你知道你的模板只出现一次,则为全局,如果它可以出现多次,则为局部),并使用密度阈值来决定模板是否出现。算法的大致草图可能是这样的:
  1. 分配一个浮点密度图,大小与您的图像相同
  2. 通过在每个匹配点的邻域中增加固定数量的密度图(例如,对于每个匹配点,在您在问题中显示的矩形中添加固定值epsilon)来计算密度图
  3. 找到密度图的全局或局部最大值(可以使用opencv函数MinMaxLoc找到全局最大值,并且可以使用形态数学找到局部最大值,例如如何在MATLAB中找到图像的局部最大值?
  4. 对于获得的每个最大值,将相应的密度值与阈值tau进行比较,以决定模板是否存在

如果您对研究文章感兴趣,可以查看以下文章以改进此基本算法:

编辑:另一种解决您的问题的方法是尝试删除意外匹配的点,只保留真正对应于模板图像的点。这可以通过强制在接近匹配点之间保持一致性约束来完成。以下研究文章介绍了这样一种方法:"基于上下文的标志匹配和检索", 作者:H.Sahbi、L.Ballan、G.Serra、A.Del Bimbo,2010年(但是,这可能需要一些背景知识...)。

希望这有所帮助。

是的,这就是我所要求的。我会查看您的算法,并阅读这两个PDF文件,看看它们是否能帮助我。到目前为止,谢谢 :) - Mickey
你的算法是个好主意。我已经可以计算比例和角度差异,所以我会让用户设置这两个参数的阈值和密度,如果所有的值都在这些阈值以下,那么我将返回是否找到匹配项。 悬赏还剩三天,我会尝试一下,如果解决了我的问题,我会告诉你的。 - Mickey
好的,请注意更新密度图的方式是需要考虑的重要事项。我的回答提到,可以使用当前匹配点的比例/方向来定义增加密度图的邻域大小。然而,这可能会为单个模板出现生成多个检测结果。另一种合理的方法可能是使用以当前点为中心的模板大小。请自行选择最适合您的方法。 - BConic

0

当你比较点时,你会使用一些度量标准。

因此,结果或比较具有某种距离。

而这个距离越小,就越好。

代码示例:

BFMatcher matcher(NORM_L2,true);
vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);
matches.erase(std::remove_if(matches.begin(),matches.end(),bad_dist),matches.end());

其中bad_dist被定义为

bool dist(const DMatch &m) {
    return m.distance > 150;
}

在这段代码中,我摆脱了“不好”的匹配项。

我的代码有两个参数:minHessian和distance。第二个参数正好做你所说的事情。这已经是我正在考虑的一个方面。 - Mickey
是的。选择更大的 minHessian 值,您将获得更多稳健的点,因此也可以通过该参数增强识别能力。然而,使用距离值也是一种常见的方法。 - silver_rocket
我已经在使用这两个参数了。我想我必须稍微改变一下我的问题。这两个参数表示MATCHPOINT的好坏程度。我的问题更像是这样的:我有一堆MATCHPOINT,它们已经通过minHessian和距离值进行了阈值处理。之后,我会像上面的图片中所示,围绕我的MATCHPOINT画一个矩形。这就是我的MATCH。现在我该如何判断这个匹配的好坏呢?我已经计算了我的新匹配和模板之间的角度、大小和颜色差异。但我认为这太模糊了。 - Mickey
当你在图像上找到一个物体(计算它的轮廓/边界矩形)时,这意味着你已经承认它是一个良好的匹配,因为你接受了构建一个对象所需的良好特征点。如果你想知道匹配和模式之间的差异,你应该知道什么会为你定义这个差异 :) 如果对你来说这只是仿射属性方面的差异(角度、缩放因子等),这就意味着你必须计算这些属性的差异,因为你可能已经尝试过。抱歉回答含糊,但这就是实情。 - silver_rocket

0

在同一图像中匹配两个模式有很多方法,实际上这是计算机视觉中一个非常开放的话题,因为没有全局最佳解决方案。

例如,如果您知道您的对象可能出现旋转(我不熟悉SURF,但我猜测描述符与SIFT描述符一样具有旋转不变性),您可以估计训练集中所拥有的模式和您刚刚匹配的模式之间的旋转。最小误差匹配将是更好的匹配。

我建议您查阅计算机视觉:算法与应用。其中没有代码,但包含了通常用于计算机视觉的许多有用技术(其中大部分已经在OpenCV中实现)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接