【发布时间】:2012-04-12 04:36:27
【问题描述】:
我正在尝试在 OpenCV 中进行一些关键特征匹配,目前我一直在使用 cv::DescriptorMatcher::match,并且正如预期的那样,我得到了很多错误匹配。
在我开始为提取的匹配编写自己的过滤器和修剪程序之前,我想尝试cv::DescriptorMatcher::radiusMatch 函数,它应该只返回比给定float maxDistance 更接近彼此的匹配。
我想为可用的 OpenCV 匹配算法编写一个包装器,以便我可以通过一个接口使用它们,该接口允许额外的功能以及额外的外部(我的)匹配实现。
由于在我的代码中,只有一个具体的类充当 OpenCV 特征匹配的包装器(类似于cv::DescriptorMatcher,它采用特定匹配算法的名称并通过 工厂方法在内部构造它/em>),我还想编写一种通用方法来实现使用cv::DescriptorMatcher::radiusMatch匹配的通用方法,该方法适用于所有不同的匹配器和功能选择(我有一个类似的包装器允许我更改在不同的 OpenCV 特征检测器之间,也实现了一些我自己的)。
不幸的是,在查看了 OpenCV 文档和cv::DescriptorMatcher 界面后,我找不到任何关于用于计算匹配之间实际距离的距离度量的信息。我找到了一个很好的匹配示例here 使用 Surf 特征和描述符,但我没有设法理解参数的特定值的实际含义。
由于我想比较使用不同特征/描述符组合时得到的结果,所以我想知道使用了哪种距离度量(以及是否可以轻松更改),以便我可以使用我尝试了所有组合都有意义的东西。
有什么想法/建议吗?
更新
我刚刚打印出了在使用 cv::DescriptorMatcher::match 和各种特征/描述符组合时得到的特征距离,我得到的是:
- MSER/SIFT 数量级:100
- SURF/SURF 数量级:0.1
- SURF/SIFT 数量级:50
- MSER/SURF 数量级:0.2
由此我可以得出结论,无论对特征应用哪种距离度量,它都绝对没有标准化。由于我使用 OpenCV 和我自己的接口来处理不同的特征提取、描述符计算和匹配方法,我想为::radiusMatch 提供一些参数,我可以将其用于所有(大多数)不同的组合。 (我尝试使用 BruteForce 和 FlannBased 匹配器进行匹配,虽然匹配略有不同,但对于每个组合,匹配之间的距离都在同一数量级上。
一些上下文:
我正在对从安装在(慢速)移动车辆顶部的摄像头获取的两张照片进行测试。这些图像应该相隔大约 5 帧(1 米的车辆运动),因此大部分特征应该是可见的,并且没有太大差异(尤其是在两张图像中远离相机的那些)。
【问题讨论】: