【发布时间】:2018-02-06 13:10:01
【问题描述】:
我是OpenCV 学习者。我正在尝试图像比较。我用过 OpenCV 2.4.13.3
我有这两张图片1.jpg 和cam1.jpg。
当我在 openCV 中使用以下命令时
File sdCard = Environment.getExternalStorageDirectory();
String path1, path2;
path1 = sdCard.getAbsolutePath() + "/1.jpg";
path2 = sdCard.getAbsolutePath() + "/cam1.jpg";
FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB);
DescriptorExtractor extractor = DescriptorExtractor.create(DescriptorExtractor.BRIEF);
DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
Mat img1 = Highgui.imread(path1);
Mat img2 = Highgui.imread(path2);
Mat descriptors1 = new Mat();
MatOfKeyPoint keypoints1 = new MatOfKeyPoint();
detector.detect(img1, keypoints1);
extractor.compute(img1, keypoints1, descriptors1);
//second image
// Mat img2 = Imgcodecs.imread(path2);
Mat descriptors2 = new Mat();
MatOfKeyPoint keypoints2 = new MatOfKeyPoint();
detector.detect(img2, keypoints2);
extractor.compute(img2, keypoints2, descriptors2);
//matcher image descriptors
MatOfDMatch matches = new MatOfDMatch();
matcher.match(descriptors1,descriptors2,matches);
// Filter matches by distance
MatOfDMatch filtered = filterMatchesByDistance(matches);
int total = (int) matches.size().height;
int Match= (int) filtered.size().height;
Log.d("LOG", "total:" + total + " Match:"+Match);
方法 filterMatchesByDistance
static MatOfDMatch filterMatchesByDistance(MatOfDMatch matches){
List<DMatch> matches_original = matches.toList();
List<DMatch> matches_filtered = new ArrayList<DMatch>();
int DIST_LIMIT = 30;
// Check all the matches distance and if it passes add to list of filtered matches
Log.d("DISTFILTER", "ORG SIZE:" + matches_original.size() + "");
for (int i = 0; i < matches_original.size(); i++) {
DMatch d = matches_original.get(i);
if (Math.abs(d.distance) <= DIST_LIMIT) {
matches_filtered.add(d);
}
}
Log.d("DISTFILTER", "FIL SIZE:" + matches_filtered.size() + "");
MatOfDMatch mat = new MatOfDMatch();
mat.fromList(matches_filtered);
return mat;
}
日志
total:122 Match:30
从日志中我们可以看到匹配是 30。
但正如我们所见,两张图片都具有相同的视觉元素 (in)。
如何使用 openCV 获得 match=90?
如果有人可以帮助编写代码 sn-p,那就太好了。
如果使用 opencv 是不可能的,那么其他是什么
我们可以寻找替代方案吗?
【问题讨论】:
-
这感觉像是在寻找有关 OpenCV 和/或图像识别的教程的问题。我正在链接到不同的 SE 小组,在该小组中阅读以下帖子:dsp.stackexchange.com/questions/17846/… 可能会为进一步研究提供适当的背景。
-
为什么不更改阈值
DIST_LIMIT?如果 30 个就足够了,获得更多匹配项的目的是什么? -
这对于 ORB/SIFT 描述符来说看起来是一个具有挑战性的图像......它基本上有 2 种颜色,并且大多数描述符(如果不是全部)将在边缘周围,这与很多相似其他边缘,所以你会得到很多误报(最佳匹配比你想象的更远),当按距离过滤时,你只会得到最接近它的那些。也许你必须尝试另一种方法,更像是模式匹配等等
-
github.com/opencv/opencv/blob/master/samples/cpp/… 你检查过这个吗?为您的图像提供良好的效果。
-
我同意@api55,特征检测/匹配不适合这类图像,因为它们不会产生足够的唯一关键点。您应该对pattern matching 有更多的运气,不幸的是它不适合旋转。另外,请不要专门要求代码,SO不是编码服务。
标签: android image opencv image-processing