我正在尝试实现一个非常简单的程序来查找两个图像之间的相似之处。
我正在使用 ORB 特征检测器和图像描述符来完成此任务,并且我正在使用以下方法识别匹配knnMatch:
FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
DescriptorExtractor descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB);
DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
// DETECTION
// 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);
// MATCHING
// match these two keypoints sets
List<MatOfDMatch> matches = new ArrayList<MatOfDMatch>();
matcher.knnMatch(descriptors1, descriptors2, matches, 5);
我能够按如下方式绘制比赛:
// DRAWING OUTPUT
Mat outputImg = new Mat();
// this will draw all matches, works fine
Features2d.drawMatches2(img1, keypoints1, img2, keypoints2, matches, outputImg);
// save image
Imgcodecs.imwrite("result.jpg", outputImg);
问题是比赛太多了,而且还包括那些差距很大的比赛。我似乎无法找到如何仅提取良好的匹配项(超过某个阈值)?有人可以指出我正确的方向或将我重定向到一些基本的工作示例吗?我在这上面花了几个小时,似乎迷失了..
EDIT:
我试着看看关键点匹配只能工作两次......? (java opencv) https://stackoverflow.com/questions/25752497/keypoint-matching-just-works-two-times-java-opencv但标准(非 knn)匹配使用不同的结构,我无法使其工作。