计算密集关键点的描述符

时间:2012-10-16 09:12:48

标签: android opencv feature-extraction

在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.totaldescriptors0.rows()时,这些数量应相等,因为描述符提取器应删除无法计算描述符的关键点。但事实并非如此。

我明白了:

pointsmat0.total() around 10000
descrpitors0.rows() around 8000

我尝试过使用BRIEF描述符提取器,但这有同样的问题。所以,DENSE + ORB / DENSE + BRIEF有这个问题。

当我使用ORB + ORB运行此示例时,关键点的数量等于描述符的数量(两者都为500)。那么,问题是:哪个描述符提取器可以与DENSE一起使用?

1 个答案:

答案 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);

        [...]
    }

但是,请记住,您将遇到点的角度问题。