7

右上隅に何もないと一致する

OpenCVデモアプリケーション「matching_to_many_images.cpp」を変更して、画像(左)をWebカメラ(右)からのフレームにクエリしました。最初の画像の右上隅の何が問題になっていますか?

これは私たちが抱えている別の問題に関連していると思います。空のデータベースから始めて、一意の機能(データベース内の機能と一致しない機能)のみを追加しますが、3つの機能のみを追加した後、すべての新しい機能に一致します。

使用しているもの:SurfFeatureDetector surfFeatureDetector(400,3,4); SurfDescriptorExtractor surfDescriptorExtractor; FlannBasedMatcher flannDescriptorMatcher;

完全なコードは次の場所にあります:http://www.copypastecode.com/71973/

4

3 に答える 3

10

これは国境のキーポイントと関係があると思います。検出器はキーポイントを検出しますが、SURF記述子が一貫した値を返すには、周囲のピクセルのブロック内のピクセルデータが必要です。これは、境界ピクセルでは使用できません。次のスニペットを使用して、キーポイントが検出された後、記述子が計算される前に境界点を削除できます。20以上のborderSizeを使用することをお勧めします。

removeBorderKeypoints( vector<cv::KeyPoint>& keypoints, const cv::Size imageSize, const boost::int32_t borderSize )
{
    if( borderSize > 0)
    {
        keypoints.erase( remove_if(keypoints.begin(), keypoints.end(),
                               RoiPredicatePic((float)borderSize, (float)borderSize,
                                            (float)(imageSize.width - borderSize),
                                            (float)(imageSize.height - borderSize))),
                     keypoints.end() );
    }
}

RoiPredicatePicが実装されている場所:

struct RoiPredicatePic
{
    RoiPredicatePic(float _minX, float _minY, float _maxX, float _maxY)
    : minX(_minX), minY(_minY), maxX(_maxX), maxY(_maxY)
    {}

    bool operator()( const cv::KeyPoint& keyPt) const
    {
        cv::Point2f pt = keyPt.pt;
        return (pt.x < minX) || (pt.x >= maxX) || (pt.y < minY) || (pt.y >= maxY);
    }

    float minX, minY, maxX, maxY;
};

また、近似最近傍インデックスは、画像のペア間で特徴を一致させるための最良の方法ではありません。他のもっと単純なマッチャーを試してみることをお勧めします。

于 2011-05-31T05:59:22.810 に答える
4

あなたのアプローチは完璧に機能していますが、drawMatches関数を誤って呼び出すため、間違った結果が表示されます。

あなたの間違った呼び出しは次のようなものでした:

drawMatches(image2, image2Keypoints, image1, image1Keypoints, matches, result);

正しい呼び出しは次のとおりです。

drawMatches(image1, image1Keypoints, image2, image2Keypoints, matches, result);
于 2011-12-09T16:26:54.703 に答える
3

私も同じ問題に直面しました。驚いたことに、このソリューションは境界点やKNNマッチャーとは何の関係もありません。多数の一致から「良好な一致」を除外するための別の一致戦略が必要です。

2 NN検索を使用し、次の条件を使用します-

distance(1st match)<0.6 * distance(2nd match)の場合、1stmatchは「goodmatch」です。

上記の条件を満たさないすべての一致を除外し、「良好な一致」に対してのみdrawMatchesを呼び出します。出来上がり!

于 2012-02-26T19:07:57.470 に答える