在OpenCV4Android中,我正在使用DENSE特征检测器,它在图像上放置一个点网格。接下来,我想计算这些关键点的描述符。为此,我尝试使用ORB描述符提取器。
mDetector = FeatureDetector.create(FeatureDetector.DENSE);
mExtractor = DescriptorExtractor.create(DescriptorExtractor.ORB);
MatOfKeyPoint pointsmat0 = new MatOfKeyPoint();
Mat descriptors0 = new Mat();
mDetector.detect(image0, pointsmat0);
mExtractor.compute(image0, pointsmat0, descriptors0);
现在,在输出pointsmat0.total
和descriptors0.rows()
时,这些数量应相等,因为描述符提取器应删除无法计算描述符的关键点。但事实并非如此。
我明白了:
pointsmat0.total() around 10000
descrpitors0.rows() around 8000
我尝试过使用BRIEF描述符提取器,但这有同样的问题。所以,DENSE + ORB / DENSE + BRIEF有这个问题。
当我使用ORB + ORB运行此示例时,关键点的数量等于描述符的数量(两者都为500)。那么,问题是:哪个描述符提取器可以与DENSE一起使用?
答案 0 :(得分:0)
无需单独停止使用ORB。描述符数量的减少是因为当ORB过于接近图像的边界时,ORB会过滤输入关键点。
从ORB代码(C ++实现):
void ORB::operator()( InputArray _image, InputArray _mask, vector<KeyPoint>& _keypoints,
OutputArray _descriptors, bool useProvidedKeypoints) const
{
[...]
if( do_keypoints )
{
// Get keypoints, those will be far enough from the border that
// no check will be required for the descriptor
computeKeyPoints(imagePyramid, maskPyramid, allKeypoints,
nfeatures, firstLevel, scaleFactor,
edgeThreshold, patchSize, scoreType);
}
else
{
// Remove keypoints very close to the border
KeyPointsFilter::runByImageBorder(_keypoints, image.size(), edgeThreshold);
[...]
}
但是,请记住,您将遇到点的角度问题。