我尝试使用一些内置的OpenCV功能检测器在图像上运行特征检测。但是,我只想检测图像中存在的顶部/最佳 n 特征(本例中假设为30)。我已经有代码可以找到功能,然后使用它们来识别其他图像中的对象,但我不知道如何限制找到的关键点的数量。我初始化各种探测器/提取器/匹配器如下:
private final FeatureDetector mFeatureDetector = FeatureDetector.create(FeatureDetector.ORB);
private final DescriptorExtractor mDescriptorExtractor = descriptorExtractor.create(DescriptorExtractor.ORB);
private final DescriptorMatcher mDescriptorMatcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMINGLUT);
我已经尝试在SO上找到解决方案但我能找到的唯一解决方案aren't for the android version of OpenCV。尝试使用这些解决方案的类似方法也没有用。
我能想到的唯一可行方法就是采用前30个功能,但我不认为这样可以很好地工作,因为它们可能都聚集在图像的一个部分。所以我想知道是否有人知道如何选择前30个功能(如果他们确实可以)。我不介意解决方案适用于哪种特征检测算法(MSER,ORB,SIFT,SURF,STAR,GFTT等)。
我还要求每次都能检测到30个特征,因此请使用灵敏度,直到它正确"关于正确"不是一个选择。
编辑:需要找到30个功能的原因是我将使用它们来训练我的探测器。我的想法是,我将从一组训练图像中获取30个特征,然后使用结果在场景中再次找到该对象。由于训练图像将是对象的近距离,因此特征不会聚集在图像的一部分中并不重要。
答案 0 :(得分:0)
虽然我找不到设置要搜索的关键点数量的方法,但我已经能够找出如何在之后提取正确数量的关键点。这样做不是计算效率,但从我收到的评论中我不认为以前这样做是可能的。
我的关键点变量是:
private final MatOfKeyPoint mTargetKeypoints = new MatOfKeyPoint();
在“填充”特征之后(它似乎在500之后停止)可以通过将各个特征转换为数组来提取各个特征(其中数组的每个元素都是一个特征。
mTargetKeypoints.toArray()[0]; //NOTE: Not actual code, used in a print statement
当我打印上面的内容时,结果是:
KeyPoint [pt = {82.0,232.0},size = 31.0,angle = 267.77094,response = 0.0041551706,octave = 0,class_id = -1]
然后可以使用内置的Keypoint函数提取个人信息,例如:
mTargetKeypoints.toArray()[0].pt.x //Printing outputs x location of feature.
mTargetKeypoints.toArray()[0].response // Printing outputs response of feature.
This所以问题表明响应表示关键点“有多好”。因此,从这里选择最好使用的30个功能相对简单。