我正在尝试使用OpenCV库比较两张图片(确定它们是否相似)。我配置了Java包装器并找到了几个教程(主要是C / C ++),我正在尝试将其改写为Java。我正在使用特征检测方法。
问题在于我当前的算法不能产生任何合理的结果(它声称两个相似的图像没有共同之处,并在其他两个完全不同的图像之间找到匹配项)。是否有人能建议我如何使用openCV匹配器来产生一些合理的结果?
这是我用于图像比较的代码
private static void compareImages(String path1, String path2) {
System.out.println(path1 + "-" + path2);
FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
DescriptorExtractor descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB);
DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
// first image
Mat img1 = Imgcodecs.imread(path1, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
Mat descriptors1 = new Mat();
MatOfKeyPoint keypoints1 = new MatOfKeyPoint();
detector.detect(img1, keypoints1);
descriptor.compute(img1, keypoints1, descriptors1);
// second image
Mat img2 = Imgcodecs.imread(path2, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
Mat descriptors2 = new Mat();
MatOfKeyPoint keypoints2 = new MatOfKeyPoint();
detector.detect(img2, keypoints2);
descriptor.compute(img2, keypoints2, descriptors2);
// match these two keypoints sets
MatOfDMatch matches = new MatOfDMatch();
matcher.match(descriptors1, descriptors2, matches);
for (DMatch m : matches.toArray()) {
// how to use these values to detect the similarity? They seem to be way off
// all of these values are in range 50-80 which seems wrong to me
System.out.println(m.distance);
}
}
不幸的是,像SURF和SIFT这样的算法在Java包装器中不可用,因此我正在使用ORB。我几乎没有计算机视觉方面的经验,我只是尝试让这个简单的比较算法工作以产生一些合理的结果。我会很高兴得到任何帮助!
编辑:我的用例是对从不同角度拍摄的图像运行此算法。我更新了代码以更好地格式化。
要比较的示例图像:
cv::Stitcher
类拼接两个图像,该类内部使用xfeatures2d::SURF
,但拼接失败了。我认为这意味着通过SURF识别图像相似度很困难。 - sturkmen