我目前正在 OpenCV 中使用 SURF 进行模式识别。到目前为止我有什么:我已经用 C# 编写了一个程序,我可以在其中选择源图像和我想要查找的模板。之后,我将两张图片传输到 C++-dll 中,在其中使用 OpenCV-SURFDetector 实现了一个程序,该程序将所有关键点和匹配项返回到我的 C# 程序,在其中我尝试在匹配项周围绘制一个矩形。
现在我的问题是:模式识别是否有通用的准确性衡量标准?例如匹配数量与模板中关键点数量的比例?或者也许我的匹配矩形和模板图像的原始尺寸之间的尺寸差异?用于判断匹配是否“真实”和“良好”匹配的常用参数有哪些?
Edit:为了让我的问题更清楚。我有一堆匹配点,它们已经通过 minHessian 和距离值设定了阈值。之后,我在赛点周围画了一个类似矩形的东西,正如你在我的图片中看到的那样。这是我的比赛。我现在怎么知道这场比赛有多精彩?我已经在计算现在找到的匹配项与模板之间的角度、大小和颜色差异。但我认为这太模糊了。
我不能 100% 确定你真正要问的是什么,因为你所谓的“匹配”是模糊的。但既然你说你已经匹配了你的 SURF 点并提到了模式识别和模板的使用,我假设你最终想要本地化图像中的模板,并且你正在询问本地化分数来决定你是否找到了模板是否在图像中。
这是一个具有挑战性的问题,我不知道是否已经找到了一个好的且始终合适的解决方案。
但是,根据您的方法,您可以做的是分析图像中匹配点的密度:将局部或全局最大值视为模板的可能位置(如果您知道模板在图像中只出现一次,则为全局,如果可以,则为局部)出现多次)并使用密度阈值来决定模板是否出现。该算法的草图可能是这样的:
- 分配图像大小的浮点密度图
- 通过将每个匹配点的邻域中的密度图增加固定量来计算密度图(例如,对于每个匹配点,添加一个固定值epsilon在您问题中显示的矩形中)
- 找到密度图的全局或局部最大值(可以使用 opencv 函数 MinMaxLoc 找到全局最大值,可以使用形态数学找到局部最大值,例如如何在 MATLAB 中找到图像中的局部最大值? https://stackoverflow.com/questions/1856197/how-can-i-find-local-maxima-in-an-image-in-matlab)
- 对于获得的每个最大值,将相应的密度值与阈值进行比较tau,来决定你的模板是否存在
如果您喜欢研究文章,您可以查看以下文章以改进此基本算法:
“具有用于实时车辆视觉检测的关键点存在功能的 ADABOOST”,作者:T.Bdiri、F.Moutarde、N.Bourdis 和 B.Steux,2009 年。 http://arxiv.org/pdf/0910.1273
“交错对象分类和分割”,B.Leibe 和 B.Schiele,2006 年。 ftp://ftp.vision.ee.ethz.ch/publications/bookchapters/eth_biwi_00422.pdf
EDIT:解决问题的另一种方法是尝试删除意外匹配的点,以便仅保留那些真正与模板图像相对应的点。这可以通过强制紧密匹配点之间的一致性约束来完成。以下研究文章提出了这样的方法:“上下文相关的徽标匹配和检索”,作者:H.Sahbi、L.Ballan、G.Serra、A.Del Bimbo,2010 年 http://perso.telecom-paristech.fr/~sahbi/publication-193.pdf(但是,这可能需要一些背景知识......)。
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)