我正在使用Opencv C++作为人脸识别应用程序。为此,我使用SURF
作为描述符,使用FlannMatcher
来匹配点。我的代码如下,
FlannBasedMatcher matcher;
std::vector< DMatch > matches;
matcher.match( descriptors_1, descriptors_2, matches );
double max_dist = 0; double min_dist = 100;
for( int i = 0; i < descriptors_1.rows; i++ )
{
double dist = matches[i].distance;
if( dist < min_dist ) min_dist = dist;
if( dist > max_dist ) max_dist = dist;
}
这里我们找到min_dist
和max_dist
来检查两个面之间是否匹配。但是我不明白min_dist
和max_dist
是什么意思。
这到底意味着什么?为什么我们需要为单个描述符找到min_dist
和max_dist
如您所知,SIFT描述符是高维空间中的向量,即128。当你在图像上运行它来寻找兴趣点时,它会找到一些点作为兴趣点,并将它们的描述符作为向量来描述高维空间中的这个点。
第一个图像中的这些点中的每一个,比如A
,在另一个图像中应该有一个对应的点,比如B
!这意味着,那些距离最小的人最有可能是通讯员,但并非所有人。其中一些可能是异常值,我们预计在其检测到的对应关系中具有较高的距离值。这使得我们在代码中使用max_dsist
。在某些类型的上下文中,您可能不希望所有最佳匹配,因为对应点的数量可能相对较高,或者。。。。因此,我们定义了距离的下界,我们用min_dist
这样做。
我希望这能给你真知灼见!