2012-01-17 12 views
9

私はOpenCVでオブジェクト検出のプロジェクトを行っています。 、hereアルゴリズムの特徴はacurately検出され、マッチした取得SIFTが、私はあなたが検出された物体の周りに長方形をしたい場合は私のアルゴリズムはKD-ツリーEST EANまず技術を使用しています マッチした特徴の周りrectagleが一致OpenCVでSIFTで抽出されたフィーチャを使用してターゲットオブジェクトの周りを矩形にする方法

答えて

7

を取得したい使い方あなたはまさにそのコード例を持っています。あなたはホモグラフィの周りにdraw a rectangleする必要があります。

希望に役立ちます。がんばろう。

+1

実際に私のプロジェクトでオブジェクトマッチングにRobb HessのSIFTライブラリを使用していますが、要件に応じて一致するコードが実行されますが、一致するオブジェクトの周囲に矩形が表示されます – Punit

+1

このリンクは、長方形を描くのは簡単です。彼らがやっていることを理解し、あなたのコードのホモグラフィHに適用するだけです。 http://nashruddin.com/OpenCV_Region_of_Ivaluerest_(ROI) –

+1

Thnx Jav_rockのコードは非常に役に立ちます。ドキュメント化されたバージョンを入手できます – Punit

5

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

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

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

SIFT keypoint patch extract example

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; 
} 

私はスケールが完全にOKであるかどうかわからないけど、それはSURFソースから取得され、結果は私にとって重要です。

関連する問題