在OpenCV中使用SURF进行模式识别的精度测量

时间:2014-02-07 08:22:33

标签: c++ opencv computer-vision surf pattern-recognition

我目前正致力于在OpenCV中使用SURF进行模式识别。到目前为止我有什么:我在C#编写了一个程序,我可以选择一个源图像和一个我想要找到的模板。之后,我将两张图片转移到一个C ++ - dll中,我使用OpenCV-SURFdetector实现了一个程序,它返回所有关键点并匹配回我的C#程序,我尝试在我的匹配项周围绘制一个矩形。

This pictures shows a source-image and a template with it's keypoints and matches. Also I've tried to calculate a rectangle around my matches

现在我的问题:模式识别中是否有一个共同的准确度量度?例如,与模板中关键点数量成比例的匹配数量?或者我的匹配矩形和模板图像的原始大小之间的大小差异?如果匹配是“真实”和“好”匹配,常用参数是什么?

修改:让我的问题更加清晰。我有一堆匹配点,已经被minHessian和距离值阈值化了。在那之后,我在我的比赛点周围绘制了一个像矩形的东西,就像我在图片中看到的那样。这是我的比赛。我现在怎么知道这场比赛有多好?我已经在计算我现在找到的匹配项和模板之间的角度,大小和颜色差异了。但我觉得这太模糊了。

3 个答案:

答案 0 :(得分:3)

我不是百分之百确定你真正在问什么,因为你所说的“匹配”是模糊的。但既然你说你已经匹配了你的SURF点并且提到了模式识别和模板的使用,我假设你最终想要在你的图像中本地化模板而你要问一个本地化分数来决定你是否找到了图像中的模板与否。

这是一个具有挑战性的问题,我不知道已找到一个好的,始终适用的解决方案。

但是,根据您的方法,您可以做的是分析图像中匹配点的密度:将局部或全局最大值视为模板的可能位置(如果您知道模板仅在图像中出现一次,则为全局如果它可以出现多次)并使用密度阈值来决定模板是否出现。算法的草图可能是这样的:

  1. 分配图像大小的浮点密度贴图
  2. 计算密度图,通过在每个匹配点附近增加固定量的密度图(例如,对于每个匹配点,在矩形中添加固定值 epsilon 显示在你的问题中)
  3. 查找密度图的全局或局部最大值(全局可以使用opencv函数MinMaxLoc找到,并且可以使用morpho数学找到局部最大值,例如How can I find local maxima in an image in MATLAB?
  4. 对于获得的每个最大值,将相应的密度值与阈值 tau 进行比较,以确定您的模板是否存在
  5. 如果您参与研究文章,可以查看以下内容以改进此基本算法:

    编辑:解决问题的另一种方法是尝试删除意外匹配的点,以便只保留与模板图像真正对应的点。这可以通过在紧密匹配点之间强制执行约束来完成。以下研究文章提出了这样的方法:"Context-dependent logo matching and retrieval", by H.Sahbi, L.Ballan, G.Serra, A.Del Bimbo, 2010(但是,这可能需要一些背景知识......)。

    希望这有帮助。

答案 1 :(得分: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;
}

在这段代码中我摆脱了'糟糕'的比赛。

答案 2 :(得分:0)

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

例如,如果您知道您的对象可以显示为旋转(我不熟悉SURF,但我猜这些描述符像SIFT描述符一样是旋转不变的),您可以估计训练集中的模式之间的旋转和你刚刚匹配的模式。与最小错误匹配将是更好的匹配。

我建议你咨询Computer Vision: Algorithms and Applications。其中没有代码,但通常在计算机视觉中使用了许多有用的技术(其中大多数已经在opencv中实现)。