所以我正在使用FAST探测器和FREAK描述符进行应用。当谈到匹配时,我想使用BRUTEFORCE_HAMMING匹配,但是我没有得到预期的结果(给出与原始图像无关的图像的更多匹配,然后看起来相似的图像)
我尝试了以下代码
MatOfDMatch matches = new MatOfDMatch();
matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
matcher.match(descriptors,descriptors1,matches);
MatOfDMatch goedematches = new MatOfDMatch();
double max_dist = 0;
double min_dist = 100;
//if (descriptors.cols() == descriptors1.cols())
//{
for( int i = 0; i < descriptors.rows(); i++ )
{ double dist = matches.toArray()[i].distance;
if( dist < min_dist ) min_dist = dist;
if( dist > max_dist ) max_dist = dist;
}
// should only draw good matches
for( int i = 0; i < descriptors.rows(); i++ )
{ MatOfDMatch temp = new MatOfDMatch();
if( matches.toArray()[i].distance <= 2*min_dist )
{ temp.fromArray(matches.toArray()[i]);
goedematches.push_back(temp);
}
// }
}
Log.d("LOG!", "Number of good matches= " + goedematches.size());
但它会回复“糟糕”的结果。所以我的问题是,是否有其他方法与FREAK描述符进行匹配? (我使用的是OpenCV Library 2.4.4和Java包装器,所以没有C代码)
答案 0 :(得分:1)
一旦有了描述符,蛮力方法将为您提供最接近的对应关系,因为它试图将第一个图像上的描述符与第二个图像的所有描述符进行匹配。
所以答案是否定的:使用FREAK描述符,你可以得到的最好结果(w.r.t汉明距离)就是你用蛮力匹配得到的结果。
(这就是说,当图像相似时,你应该得到很多好的和坏的匹配。你试过绘制匹配吗?尝试在匹配之间画线而不使用过滤步骤 。)
答案 1 :(得分:0)
如果您检查的图像是双重的,我建议您使用BRISK
算法,其汉明距离为10
。我在我的application中使用了这个,我开发了tool,它可以帮助您找到所需的最佳算法。也许您可以使用匹配类型升级我设计的工具。
答案 2 :(得分:0)
你可能会得到不好的结果,因为FREAK本身不是旋转和缩放不变的。 尝试在这些关键点周围使用BRISK关键点检测和FREAK描述符。
如果将描述符mat设置为null,JavaCV允许您使用BRISK关键点检测。