我正在尝试匹配此logo with this image(它们是2张不同的图片)
代码设法找到正确的关键点,但他们在两个图像之间不匹配。上面的图片也显示了关键点
代码:
在此部分之前,我正在加载两个图像并使用SIFT从每个图像中提取关键点。因此,sceneDescripters是第一个图像的关键点描述符,而templateDescripters是第二个图像的描述符。
在这部分中,我使用flann匹配每个图像的关键点。
MatOfDMatch matchs = new MatOfDMatch();
DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.FLANNBASED);
matcher.match(sceneDescripters, templateDescripters, matchs);
找到最小距离和最大距离。然后只重命名它们之间足够小的匹配。
DMatch[] matchesArr = matchs.toArray();
double minDist = Double.MAX_VALUE;
double maxDist = 0;
for(int i =0; i< matchesArr.length; i++)
{
double dist = matchesArr[i].distance;
if(dist < minDist)
minDist = dist;
else if(dist > maxDist)
maxDist = dist;
}
final double threasholdFactor = 2.0;
List<DMatch> bestMatches = new Vector<DMatch>();
for( int i = 0; i < matchesArr.length; i++ )
{
if( matchesArr[i].distance <= threasholdFactor*minDist )
{
bestMatches.add(matchesArr[i]);
}
}
MatOfDMatch bests = new MatOfDMatch();
bests.fromList(bestMatches);
Mat matchedImage = new Mat(scene.rows(), scene.cols()*2, scene.type());
Features2d.drawMatches(scene, sceneKeyPoints, template, templateKeyPoints,bests , matchedImage);
Imgcodecs.imwrite(resultImgPath, matchedImage);
我给它一个小的距离阈值,所以你可以看到它只给出了错误的匹配。如果距离越远,它将返回太多匹配。