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.totalとこれらの量は等しくなければなりません。descriptors0.rows()しかし、そうではありません。

私は得る:

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

BRIEF 記述子エクストラクタを使用してみましたが、これにも同じ問題があります。したがって、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 に答える