我一直在制作一个可以比较2张图像的应用程序(我的智能手机上有2张图片)。在那里,我在有限数量的关键点上使用FAST检测器和FREAK描述符(根据响应滤出了300个最好的关键点)。当我尝试将它与BRUTEFORCE_HAMMING匹配时,它会返回0匹配。
与
匹配 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());
当我将图像与自身进行比较时,我得到以下输出。输出为0x0匹配良好。
05-02 15:52:30.325: D/LOG!(17866): Number of Descriptors image 1= 64x286
05-02 15:52:30.325: D/LOG!(17866): Number of Descriptors image 2= 64x286
05-02 15:52:30.325: D/LOG!(17866): description time elapsed 339 ms
05-02 15:52:30.555: D/LOG!(17866): Minimum distance = 0.0
05-02 15:52:30.560: D/LOG!(17866): Maximum distance= 0.0
05-02 15:52:30.560: D/LOG!(17866): Number of good matches= 0x0
当我使用相同的图片和与之无关的图片时,我会得到大约471个匹配。代码中有一些错误,但我似乎无法看到什么是错的(代码似乎保留了,因为所有相同的东西都不匹配,并且当它完全不同时它匹配。代码在哪里我做错了吗?)
重要事项:不要介意右图上的红点,这只是我在屏幕上绘制关键点时拍摄的旧照片。它不代表匹配本身!它可能是与第一张图像无关的任何其他图片。
05-02 16:03:06.120: D/LOG!(19025): Number of Descriptors image 1= 64x259
05-02 16:03:06.120: D/LOG!(19025): Number of Descriptors image 2= 64x286
05-02 16:03:06.420: D/LOG!(19025): Minimum distance= 93.0
05-02 16:03:06.420: D/LOG!(19025): Maximum distance = 183.0
05-02 16:03:06.420: D/LOG!(19025): Number of good matches= 1x286
答案 0 :(得分:1)
if( matches.toArray()[i].distance < 2*min_dist )
在第一种情况下,您比较相同的图像,因此min_dist的值为0 并且你的if语句将拒绝所有匹配,因为没有距离小于0.
在你的第二种情况下,min_dist是93 * 2 = 186,并且由于你的maximum_distance是183,这将导致接受所有匹配而不是拒绝它们。
考虑在第9章中查看opencv计算机视觉食谱,有一种很好的方法可以保持基于比率和对称性测试的良好匹配。