9

テンプレート画像のオブジェクトを参照画像と照合することで構成されるオブジェクト検出に関するOpenCVのプロジェクトを行っています。SIFTアルゴリズムを使用すると、機能が正確に検出され、一致しますが、一致した機能の周りに四角形が必要です私のアルゴリズムはKD-Tree est ean Firstテクニックを使用して一致を取得します

4

2 に答える 2

7

検出されたオブジェクトの周りに長方形が必要な場合は、まさにそれを含むコード例がありますホモグラフィHの周りに長方形を描く必要があります。

それが役に立てば幸い。幸運を。

于 2012-01-17T15:09:53.207 に答える
5

キーポイントの周囲を抽出するために、OpenCV (modules/features2d/src/surf.cpp) の SURF アルゴリズムから適合させた次のコードを使用します。

四角形と ROI に基づく他の例とは別に、このコードは、特徴検出アルゴリズム (両方ともKeyPoint構造体で使用可能) によって決定された向きとスケールに従って、正しい向きのパッチを返します。

いくつかの異なる画像での検出結果の例:

SIFT キーポイント パッチの抽出例

const int PATCH_SZ = 20;
Mat extractKeyPoint(const Mat& image, KeyPoint kp)
{
    int x = (int)kp.pt.x;
    int y = (int)kp.pt.y;
    float size = kp.size;
    float angle = kp.angle;

    int win_size = (int)((PATCH_SZ+1)*size*1.2f/9.0);
    Mat win(win_size, win_size, CV_8UC3);

    float descriptor_dir = angle * (CV_PI/180);
    float sin_dir = sin(descriptor_dir);
    float cos_dir = cos(descriptor_dir);
    float win_offset = -(float)(win_size-1)/2;
    float start_x = x + win_offset*cos_dir + win_offset*sin_dir;
    float start_y = y - win_offset*sin_dir + win_offset*cos_dir;
    uchar* WIN = win.data;
    uchar* IMG = image.data;
    for( int i = 0; i < win_size; i++, start_x += sin_dir, start_y += cos_dir )
    {
        float pixel_x = start_x;
        float pixel_y = start_y;
        for( int j = 0; j < win_size; j++, pixel_x += cos_dir, pixel_y -= sin_dir )
        {
            int x = std::min(std::max(cvRound(pixel_x), 0), image.cols-1);
            int y = std::min(std::max(cvRound(pixel_y), 0), image.rows-1);
            for (int c=0; c<3; c++) {
                WIN[i*win_size*3 + j*3 + c] = IMG[y*image.step1() + x*3 + c];
            }
        }
    }
    return win;
}

スケールが完全に正しいかどうかはわかりませんが、これは SURF ソースから取得したものであり、結果は私に関連しているように見えます。

于 2012-01-17T15:11:55.080 に答える