我試圖使用OpenCV庫比較兩個圖像(確定它們是否相似)。我配置了java包裝器,並找到了一些我正在嘗試重寫入Java的教程(主要是C/C++)。我正在使用特徵檢測方法。在Java中使用OpenCV比較兩個圖像
的問題是,我現在有不產生任何合理的結果的算法(它聲稱,兩個類似的圖像沒有任何共同之處,並且是完全不同的另外兩個圖像之間找到匹配)。有人可能會建議我應該如何使用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代碼。我對計算機視覺幾乎沒有任何經驗,我只是試圖讓這個簡單的比較算法的工作產生一些合理的結果。我會很高興的任何幫助!
編輯:我的用例是針對從不同角度拍攝的圖像運行此算法。我更新了我的代碼以更好地格式化。
樣本圖像進行比較:
[可能是有用的(http://stackoverflow.com/questions/15544158/error-matching-with-orb-in- android) – GPPK
鏈接中的算法似乎與我在這裏完全一樣...仍然產生非常差的結果。我只想加載兩個圖像併產生一些值,表明它們的相似性 – Smajl
只是一個註釋:我試圖用'cv :: Stitcher'類內部使用'xfeatures2d :: SURF'來縫合兩個圖像,並且失敗。我認爲這意味着很難確定SURF的圖像的相似性 – sturkmen