2

在 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

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

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

4

1 回答 1

1

无需为此停止使用 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);

        [...]
    }

但是,请记住,点的角度会有问题。

于 2014-04-30T07:57:39.200 回答