2011-08-31 19 views
19

画像のコーナーを見つけようとしていますが、輪郭は必要ありません。コーナーは4つしかありません。 4つのコーナーを使って視点を変更します。OpenCvを使用して画像のコーナーを見つける方法

私はOpencvを使用していますが、私はコーナーを見つけるためのステップと私が使用する機能を知る必要があります。

私のイメージはこのようになります(赤のポイントなしで、私は後にポイントをペイントします) enter image description here

EDITED:(注:: - 私

推奨される手順の後、私は、コードをwrited純粋なOpenCvを使用せず、私はjavaCVを使用していますが、論理は同じです)。

// Load two images and allocate other structures (I´m using other image) 
    IplImage colored = cvLoadImage(
      "res/scanteste.jpg", 
      CV_LOAD_IMAGE_UNCHANGED); 

enter image description here

IplImage gray = cvCreateImage(cvGetSize(colored), IPL_DEPTH_8U, 1); 
    IplImage smooth = cvCreateImage(cvGetSize(colored), IPL_DEPTH_8U, 1); 

    //Step 1 - Convert from RGB to grayscale (cvCvtColor) 
    cvCvtColor(colored, gray, CV_RGB2GRAY); 

enter image description here

//2 Smooth (cvSmooth) 
    cvSmooth(gray, smooth, CV_BLUR, 9, 9, 2, 2); 

enter image description here

//3 - cvThreshold - What values? 
    cvThreshold(gray,gray, 155, 255, CV_THRESH_BINARY); 

enter image description hereenter image description here

//5 - Find contours (cvFindContours) 
    int total = 0; 
    CvSeq contour2 = new CvSeq(null); 
    CvMemStorage storage2 = cvCreateMemStorage(0); 
    CvMemStorage storageHull = cvCreateMemStorage(0); 
    total = cvFindContours(gray, storage2, contour2, Loader.sizeof(CvContour.class), CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE); 
    if(total > 1){ 
      while (contour2 != null && !contour2.isNull()) { 
       if (contour2.elem_size() > 0) { 
       //6 - Approximate contours with linear features (cvApproxPoly) 
        CvSeq points = cvApproxPoly(contour2,Loader.sizeof(CvContour.class), storage2, CV_POLY_APPROX_DP,cvContourPerimeter(contour2)*0.005, 0); 
        cvDrawContours(gray, points,CvScalar.BLUE, CvScalar.BLUE, -1, 1, CV_AA); 

       } 
       contour2 = contour2.h_next(); 
      } 

    } 

enter image description here

//4 - Detect edges (cvCanny) -What values? 
    int N = 7; 
    int aperature_size = N; 
    double lowThresh = 20; 
    double highThresh = 40;  
    cvCanny(gray, gray, lowThresh*N*N, highThresh*N*N, aperature_size); 
だから、私は、コーンズを見つけたいが、私はコーナーがcvCornerHarrisなどのように機能を使用する方法を知っているドント。

+3

のこのセットに凸包を適用するポイント のリストを取得しますおおまかに言えば、水平方向と垂直方向に大きなばらつきのある領域があります。 OpenCVのコーナー機能の目標は、ビジュアルトラッキングに役立つ画像の特徴的な部分を見つけることです。これは必ずしもコーナーとして一般的に考えるものではありません。 –

+0

正確なコードはhttp://stackoverflow.com/a/14368605/1832154です(画像サイズが小さいので、サイズ変更部分は除く)。http://i.imgur.com/hMdAlHX.png – mmgp

答えて

22

まず、あなたのOpenCVのディストリビューションで/samples/c/squares.cをチェックしてください。この例では四角形の検出器を提供していますが、角のようなフィーチャを検出する方法はかなり良いスタートです。次に、cvCornerHarris()やcvGoodFeaturesToTrack()などのOpenCVの機能指向の関数を見てみましょう。

上記の方法は、多くのコーナーのような機能を返すことができます。ほとんどの場合、あなたが探している真のコーナーではありません。私のアプリケーションでは、(視点から)回転したり歪んだ四角形を検出しなければなりませんでした。 (cvCvtColor)

  • スムーズ(cvSmooth)
  • しきい値(cvThreshold)
  • 検出エッジ(cvCanny)
  • 輪郭(cvFindContoursを)検索をグレースケールにRGBから

    1. 変換:私の検出パイプラインはから成って
    2. 線形フィーチャ(cvApproxPoly)を持つ近似輪郭
    3. ポリゴン化された等高線を持つ構造体である「長方形」を検索します。 4点を歌い、十分な面積を有し、隣接する辺が〜90度であり、「反対の」頂点間の距離が十分な大きさなどであった。

    多少ノイズの多い画像で多角形化後に長方形に見える多くの構造が得られるため、ステップ7が必要でした。私のアプリケーションでは、希望の四角形の中に現れたり、重なり合った四角形の構造を扱わなければなりませんでした。私は輪郭の面積特性と重心が適切な四角形を識別するのに役立つことを発見しました。

  • +0

    私は手順7で少し助けが必要です、私の例では、cvCornerHarrisを使用する方法は、編集された記事を参照してください、あなたは私を助けることができますか? – Ricardo

    +1

    cvSmoothはガウスぼかしのようなものですか? cvCannyの結果を拡大しますか? どのように輪郭を近似しますか?5つのコーナー(シャドウなどのために変形した四角形)や小さな尾根を持つsuqaresとしましょう。 あなたのアプローチはかなり私がしたいことですが、私は非常に苦労しています。いくつかのコード例を提供できますか?非常に役立つだろう。 – sschrass

    7
    +0

    フォローするアップアップし、少しスバルクグラブブログを再ハッシュする:エッジを見つける方法でコーナーを見つけることを試みなさい。しきい値のある画像から始めて、顕著な直線(ハフ)を見つけ、交差する場所を探します。それがあなたのコーナーです。 –

    0

    キャニー画像にhoughlinesを適用する - - あなたはOpenCVのの「コーナー」機能は、あなたが考えているように、コーナーを見つけていない点を

    関連する問題