OpenCVの輪郭境界の矩形

1.探し概要

API

 のcv :: findContours(InputOutputArrayイメージ、OutputArrayOfArrays輪郭、OutputArray階層、int型モード、int型の方法、ポイント=ポイント(オフセット)

詳細な各種パラメータを次のように

  • 画像は、入力画像を示し、二値画像である必要があり、二値画像を出力閾値、キャニー出力INRANGE出力、適応閾値出力であってもよいです。
  • 輪郭取得プロファイルは、各プロファイルは、収集ポイントのシリーズです
  • 階層レベル情報輪郭、各輪郭線は、4つの情報、すなわち、下位層と前面、最初の子ノード、親ノードを有しています
  • 唯一の最も外側の輪郭が輪郭ツリー構造を表す返すトポロジリターン-RETR_EXTERNAL見たときの輪郭モードを表す-RETR_TREE
    • CV_RETR_EXTERNAL:だけ外側輪郭を検出します。アウトラインの内側の穴を無視

    • CV_RETR_LIST:すべての輪郭を検出しますが、継承(付属)の関係を確立していません

    • CV_RETR_TREE:すべての輪郭を検出し、すべての継承(含まれる)関係の確立。すなわち前者は関係が含まれていないため、階層の時間CV_RETR_EXTERNALとCV_RETR_LIST方法でこの変数は、無用であるが、唯一のヨーヨーの輪郭上に見出されるが、包含関係を区別しない輪郭の外側に見出されます。この検出方法の木を使用している場合、このパラメータの私達の階層が有意義です。実際には、ときに、アプリケーション最初の2つの方法は、我々は文の第2の機能を使用しますfindContours

    • CV_RETR_CCOMP:すべての輪郭を検出し、2人のだけの関係の確立を含みます。プロファイルの内側の輪郭は、その後、これらの内側輪郭に上部層に入れた場合に上部外側輪郭に、底部層に第一層を含む内側輪郭の外側の輪郭は、さらに備えます。

  • この方法は、どのようなアルゴリズムに基づいて行われる輪郭点の集合を表し、それは一般的CHAIN_APPROX_SIMPLEチェーンコーディング法に基づいて

なお、背景画像が白である場合、最も外側の輪郭検出画像フレーム

 

2.境界の矩形のアウトラインを描きます

境界の矩形を描画すると、2種類の方法があります。

  • 最大外接する四角形を描画します
(のRect CV :: boundingRect(InputArray点))

前記入力パラメータセットポイントポイントのシリーズ(輪郭findContoursの要素)として、それは、プロファイルの輪郭上の点は、結果セットが、H、W、矩形、X、Yであり、返され

  • 最小外接矩形を描画(RotatedRect CV :: minAreaRect(InputArrayポイント))

点のシリーズ(等高線でfindContours素子)などの入力パラメータセットポイントは、輪郭が輪郭点は、結果が回転矩形で返すように設定されており、次の情報が含まれてい - 矩形の中心の位置 - 矩形を広い高 - 回転角度

 

3.コード

EdgeDetection.h

1  の#pragma2の#include <opencv2 / opencv.hpp>
 3の#include <iostreamの>
 4  
5  使用 名前空間STDを、
6  使用して 名前空間の品種;
7  
8  
9  クラスエッジ検出
 10  {
 11      CV ::マットm_img。
12      CV ::マットm_canny。
13  公衆14      エッジ検出(CV ::マットiamge)。
15      ブール cannyProcess(符号無し整数 downThreshold、符号なし整数upThreshold)。
16      BOOLgetContours();
17      
18エッジ検出();
19 }。

EdgeDetection.cpp

1の#include " EdgeDetection.h " 
2  
3  エッジ検出::エッジ検出(CV ::マット画像)
 4  {
 5      = m_img 画像。
6  }
 7  
8  ブールエッジ検出:: cannyProcess(符号無し整数 downThreshold、符号なし整数upThreshold)
 9  {
 10      ブール RET = 11  
12      であれば(m_img.empty())
 13      {
 14          RET = 15      }
 16  
17     CV ::キャニー(m_img、m_canny、downThreshold、upThreshold)。
18      CV ::関数imshow(" キャニー" 、m_canny)。 
19  
20      リターンRET。
21  }
 22  
23  ブールエッジ検出:: getContours()
 24  {
 25      ブール RET = 26      であれば(m_canny.empty())
 27      {
 28          RET = 29      }
 30      
31      、CV ::マットK = CV :: getStructuringElement(CV :: MORPH_RECT、CV ::サイズ(33)、CV ::ポイント( - 1、 - 1。 ));
 32      CV :: DILATE(m_canny、m_canny、K);
 33である      (関数imshow " 拡張" )、m_cannyを、
 34は     
35      // 見つかった輪郭描画
36      ベクトル<ベクトル<ポイント:: CV >> 等高線、
 37      ベクトル<Vec4i> 階層、
 38は     findContours(m_canny、輪郭、CV :: RETR_EXTERNAL、CHAIN_APPROX_SIMPLE、ポイント());
 39  
40      のためには(size_t I = 0 Iはcontours.sizeを(<。 ); ++ I)
 41は     、{
 42は、         // 最大外形
43         :: = RECTのRect CV CV :: boundingRect(等高線[I]);
 44である          CV ::矩形(m_img、RECT、スカラー:: CV(02550)、2 、LINE_8);
 45  
46である 
47          // 最小外形
48          RotatedRect RRT = minAreaRect(輪郭[I]);
 49          Point2f PTS [ 4 ];
 50          rrt.points(PTS)
 51は、         // 回転の中心位置に四角形を描画
52である         ためint型 I = 0 ;私は< 4。 ++ I ){
 53であります             線は(m_imgは、PTS [I%4 ]、PTS [(I + 1)%4 ]、スカラー(00255)、280 );
54          }
 55          Point2f CPT = rrt.center。
56          円(m_img、CPT、2、スカラ(25500)、280 );
57      }
 58  
59  
60  
61  
62  
63     関数imshow(" 輪郭" 、m_img)。
64      リターンRET;
65  }
 66  
67エッジ検出::〜エッジ検出()
 68  {
 69 }

main.cppに

#include EdgeDetection.h 
使用して 名前空間はstdを、
使用して 名前空間の品種;



INT(メインのint ARGC、チャー *のARGV [])
{
    マットSRC =関数imread(" rect.jpg " );
    もし(src.empty())
    {
        裁判所未満 << イメージが空である << てendl;
        戻る - 1 
    }

    関数imshow(" 入力" 、SRC);

    エッジ検出ED(SRC);

    ed.cannyProcess(80160 )。
    ed.getContours();

    waitKey(0 )。
    リターン 0 ;
}

芸術作品

 

 

 気の利きました

 

 

 図ゴール

 

おすすめ

転載: www.cnblogs.com/zhaobinyouth/p/11698968.html