2014年1月18日土曜日

Android-OpenCV 輪郭抽出(2)

Android-OpenCV 輪郭抽出(2)

前回の記事 Android-OpenCV 輪郭抽出でCannyを使用した輪郭抽出を行いましたが今回はさらに抽出した輪郭の情報も取得したいと思います。

輪郭の情報を取得するには

Imgproc.findContours(Mat image, List<MatOfPoint> contours, Mat hierarchy, int mode, int method)
  • image – 入力画像,8ビット,シングルチャンネル.0以外のピクセルは 1として,0のピクセルは0のまま扱われます.つまり,入力画像は 2値画像 として扱われます.グレースケールやカラー画像から2値画像を得るには, compare() , inRange() , threshold() , adaptiveThreshold() , Canny() などの関数を利用します.また,この関数は,輪郭抽出処理中に入力画像 image の中身を書き換えます.
  • contours – 検出された輪郭.各輪郭は,点のベクトルとして格納されます.
  • hiararchy – オプション.画像のトポロジーに関する情報を含む出力ベクトル.これは,輪郭数と同じ数の要素を持ちます.各輪郭 contours[i] に対して,要素 hierarchy[i][0] , hiearchy[i][1] , hiearchy[i][2] , hiearchy[i][3] にはそれぞれ,同じ階層レベルに存在する前後の輪郭,最初の子輪郭,および親輪郭の contours インデックス(0 基準)がセットされます.また,輪郭 i において,前後,親,子の輪郭が存在しない場合,それに対応する hierarchy[i] の要素は,負の値になります.
  • mode – 輪郭抽出モード
    • CV_RETR_EXTERNAL 最も外側の輪郭のみを抽出します.すべての輪郭に対して hierarchy[i][2]=hierarchy[i][3]=-1 がセットされます.
    • CV_RETR_LIST すべての輪郭を抽出しますが,一切の階層構造を保持しません.
    • CV_RETR_CCOMP すべての輪郭を抽出し,それらを2階層構造として保存します:上のレベルには,連結成分の外側の境界線が,下のレベルには,連結成分の内側に存在する穴の境界線が属します.ある連結成分の穴の内側に別の輪郭が存在する場合,その穴は上のレベルに属します.
    • CV_RETR_TREE すべての輪郭を抽出し,入れ子構造になった輪郭を完全に表現する階層構造を構成します.この完全な階層構造は,OpenCVの contours.c デモで見ることができます.
  • method – 輪郭の近似手法:
    • CV_CHAIN_APPROX_NONE すべての輪郭点を完全に格納します.つまり,この手法により格納された任意の隣り合う2点は,互いに8近傍に存在します.
    • CV_CHAIN_APPROX_SIMPLE 水平・垂直・斜めの線分を圧縮し,それらの端点のみを残します.例えば,まっすぐな矩形の輪郭線は,4つの点にエンコードされます.
    • CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS Teh-Chinチェーン近似アルゴリズムの1つを適用します. TehChin89 を参照してください.
  • offset – オプションのオフセット.各輪郭点はこの値の分だけシフトします.これは,ROIの中で抽出された輪郭を,画像全体に対して位置づけて解析する場合に役立ちます.

を用います。(OpenCV リファレンス参照)

今回は
mode Imgproc.RETR_EXTERNAL(最も外側の輪郭のみを抽出),
method Imgproc.CHAIN_APPROX_TC89_L1(Teh-Chinチェーン近似アルゴリズムの1つを適用します)
を指定します。

/*------------------------------------------------------------------------------------------------

Mat image;
List<MatOfPoint> contours;
Mat hierarchy;

Imgproc.findContours( image,  contours,  hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_TC89_L1);

--------------------------------------------------------------------------------------------------*/

これで入力画像から抽出した輪郭の情報が取得できます。

取得した輪郭の情報はcontoursに入っています。

0 件のコメント:

コメントを投稿