当对象不在 OpenCV 场景中时,`DescriptorMatcher` 会做什么?
What does `DescriptorMatcher` do when object is not in the scene in OpenCV?
我正在尝试通过将视频中的当前帧与预存储的特征描述符进行比较来检测已知对象。我的想法是将当前帧的特征与预存特征进行匹配,并在良好特征的数量超过某个阈值时报告阳性检测。
然而,这似乎不起作用,因为 DescriptorMatcher
将始终报告一定数量的匹配,而不管对象是否实际在场景中。尽管我使用非常传统的过滤方法来保留前 x 个良好匹配项,但它仍然是一个相对于当前帧的指标。
是否有类似 DescriptorMatcher
的匹配度之类的东西可以用作硬阈值?有更好的方法吗?我以前使用过 Bag of Words,但对于手头的问题来说它似乎有点矫枉过正,而且对于我的需要来说它的计算过于详尽了。任何 suggestions/tips/pointers 将不胜感激。
ImageDescriptor imageDescriptor = null;
imageDescriptor = ImageDescriptor.fromJson(jsonMetadata);
Mat storedDescriptors = imageDescriptor.getFeatureDescriptors(); // prestored features
FeatureDetector featureDetector = FeatureDetector.create(FeatureDetector.ORB);
DescriptorExtractor descriptorExtractor = DescriptorExtractor.create(DescriptorExtractor.ORB);
DescriptorMatcher descriptorMatcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
MatOfKeyPoint keyPoints = new MatOfKeyPoint();
featureDetector.detect(rgba, keyPoints); // rgba is the image from current video frame
MatOfDMatch matches = new MatOfDMatch();
Mat currDescriptors = new Mat();
descriptorExtractor.compute(rgba, keyPoints, currDescriptors);
descriptorMatcher.match(descriptors_scene, storedDescriptors, matches);
MatOfDMatch good_matches = filterMatches(matches); // filterMatches return the matches that have a distance measure of < 2.5*min_distance
if(good_matches.rows()>threshold)
return true;
return false;
descriptorMatcher 将始终找到(或尝试找到)最佳匹配(= 距离最小的匹配),它无法告诉您匹配是否真的正确。有一些方法可以猜测哪些匹配是正确的,哪些匹配是错误的。
看看比赛的差距。如果距离值太大,则匹配可能不正确(即使那是所有关键点中的最小距离)。
与其只计算最佳匹配,不如尝试计算第二个最佳匹配。如果 2nd best 和 best matches 几乎具有相同的质量( = 相同的距离),你可能会认为你无法决定,其中一个是一个很好的匹配。
使用 RANSAC 计算稳健的单应性。如果您的匹配中出现足够多的异常值,那么这些匹配可能会非常稳健。
同4.但是是基础矩阵而不是单应矩阵
没有检查,但也许可以看看这个:https://github.com/opencv/opencv/blob/master/samples/cpp/tutorial_code/calib3d/real_time_pose_estimation/src/RobustMatcher.h
http://docs.opencv.org/3.1.0/dc/d2c/tutorial_real_time_pose.html
我正在尝试通过将视频中的当前帧与预存储的特征描述符进行比较来检测已知对象。我的想法是将当前帧的特征与预存特征进行匹配,并在良好特征的数量超过某个阈值时报告阳性检测。
然而,这似乎不起作用,因为 DescriptorMatcher
将始终报告一定数量的匹配,而不管对象是否实际在场景中。尽管我使用非常传统的过滤方法来保留前 x 个良好匹配项,但它仍然是一个相对于当前帧的指标。
是否有类似 DescriptorMatcher
的匹配度之类的东西可以用作硬阈值?有更好的方法吗?我以前使用过 Bag of Words,但对于手头的问题来说它似乎有点矫枉过正,而且对于我的需要来说它的计算过于详尽了。任何 suggestions/tips/pointers 将不胜感激。
ImageDescriptor imageDescriptor = null;
imageDescriptor = ImageDescriptor.fromJson(jsonMetadata);
Mat storedDescriptors = imageDescriptor.getFeatureDescriptors(); // prestored features
FeatureDetector featureDetector = FeatureDetector.create(FeatureDetector.ORB);
DescriptorExtractor descriptorExtractor = DescriptorExtractor.create(DescriptorExtractor.ORB);
DescriptorMatcher descriptorMatcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
MatOfKeyPoint keyPoints = new MatOfKeyPoint();
featureDetector.detect(rgba, keyPoints); // rgba is the image from current video frame
MatOfDMatch matches = new MatOfDMatch();
Mat currDescriptors = new Mat();
descriptorExtractor.compute(rgba, keyPoints, currDescriptors);
descriptorMatcher.match(descriptors_scene, storedDescriptors, matches);
MatOfDMatch good_matches = filterMatches(matches); // filterMatches return the matches that have a distance measure of < 2.5*min_distance
if(good_matches.rows()>threshold)
return true;
return false;
descriptorMatcher 将始终找到(或尝试找到)最佳匹配(= 距离最小的匹配),它无法告诉您匹配是否真的正确。有一些方法可以猜测哪些匹配是正确的,哪些匹配是错误的。
看看比赛的差距。如果距离值太大,则匹配可能不正确(即使那是所有关键点中的最小距离)。
与其只计算最佳匹配,不如尝试计算第二个最佳匹配。如果 2nd best 和 best matches 几乎具有相同的质量( = 相同的距离),你可能会认为你无法决定,其中一个是一个很好的匹配。
使用 RANSAC 计算稳健的单应性。如果您的匹配中出现足够多的异常值,那么这些匹配可能会非常稳健。
同4.但是是基础矩阵而不是单应矩阵
没有检查,但也许可以看看这个:https://github.com/opencv/opencv/blob/master/samples/cpp/tutorial_code/calib3d/real_time_pose_estimation/src/RobustMatcher.h
http://docs.opencv.org/3.1.0/dc/d2c/tutorial_real_time_pose.html