在Java中将两个映像与OpenCV进行比较
我正在尝试使用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。我对计算机视觉几乎没有经验,我只是试图让这个简单的比较算法工作产生一些合理的结果。我很乐意得到任何帮助!
编辑:我的用例是针对从不同角度拍摄的图像运行此算法。我更新了我的代码以更好地格式化。
要比较的示例图像: