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 の#pragma回 2の#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 ::サイズ(3、3)、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(0、255、0)、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 ]、スカラー(0、0、255)、2、8、0 ); 54 } 55 Point2f CPT = rrt.center。 56 円(m_img、CPT、2、スカラ(255、0、0)、2、8、0 ); 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(80、160 )。 ed.getContours(); waitKey(0 )。 リターン 0 ; }
芸術作品
気の利きました
図ゴール