将 ORB 特征与阈值匹配
Posted
技术标签:
【中文标题】将 ORB 特征与阈值匹配【英文标题】:Matching ORB Features with a threshold 【发布时间】:2014-05-16 10:45:38 【问题描述】:我的项目是基于android的草药识别。我使用 ORB 来获取关键点、特征并匹配特征。
我想用这个算法:
-
我使用 4 个参考图像,并将它们的特征 image1 与 image1、1-2、1-3、1-4、2-3、3,4 进行匹配。
然后我将到数据库的最小和最大距离存储为阈值。 (最低阈值 = 总最小值/6)
当我识别出新图像时,我会将新的最小和最大距离与数据库中的距离进行比较。但我不知道该怎么做。
for (j=MinID; j<=MaxID; j++)
MatOfDMatch matches = DetectUtility.match(features, matFromJson(DB.GetORBFitur(j)));
List<DMatch> matchesList = matches.toList();
Double max_dist = 0.0;
Double min_dist = 100.0;
for (int i = 0; i < matchesList.size(); i++)
Double dist = (double) matchesList.get(i).distance;
if (dist < min_dist && dist != 0)
min_dist = dist;
if (dist > max_dist)
max_dist = dist;
从this site,我得到这个代码:
//-- Draw only "good" matches (i.e. whose distance is less than 3*min_dist )
std::vector< DMatch > good_matches;
for( int i = 0; i < descriptors_object.rows; i++ )
if( matches[i].distance < 3*min_dist )
good_matches.push_back( matches[i]);
如何获得那个神奇的数字 3? 以及我必须做什么才能达到最大距离?
我要使用的算法,我之前用过不变量矩和城市街区距离来匹配最小距离的图像。
【问题讨论】:
【参考方案1】:我也不知道。距离是特征点相似度的度量,越少越好。 original ORB paper(下图 5)显示了好匹配和坏匹配的距离分布。可以肯定地说,“良好”的距离阈值约为 64。
所以更正确的是:
double dist_th = 64;
for( int i = 0; i < descriptors_object.rows; i++ )
if( matches[i].distance < dist_th )
good_matches.push_back( matches[i]);
然后您仍然必须使用 RANSAC 过滤不一致的匹配项。因此,最简单的解决方案是将您的查询图像与所有 4 个数据库图像进行匹配。
但我建议您使用一些分类器,而不仅仅是匹配。看看这个人的方法(它有效,我认识他) - http://cmp.felk.cvut.cz/~sulcmila/
【讨论】:
感谢您的回答 :) 但我仍然不知道如何在拥有 good_matches 后将我的新图像与数据库中的图像进行匹配。我的新图像如何被认为与数据库中的女巫相匹配? “匹配”是什么意思?您的意思是“认为这种药草是 db 中的一种”?我认为,如果您从 RANSAC 获得几何验证匹配,则可以,但这对我来说非常罕见。考虑形状和纹理分类。以上是关于将 ORB 特征与阈值匹配的主要内容,如果未能解决你的问题,请参考以下文章