cvFindContoursのmodeパラメタを変えて実行してみた

昨日のエントリで書いたcvFindContoursのmodeパラメタだが、解説するよりも実際に動かした結果を見たほうが分かりやすい。なので実際に試してみた。

方法としては今まで紹介してきたようにcvCvtColorでグレイスケール化→cvThresholdを使って二値化した画像を元にcvFindContoursで抽出した輪郭をcvDrawContours関数で別なIplImageに描画している。(コードは長いので割愛する)なお、同ファンクションのmethodパラメタはCV_CHAIN_APPROX_NONEつまり全ての座標を使うに固定している。

以下は全てXcode 4.5, iPhone 5.0 シミュレータで実行した結果。

素材

矩形と文字を両方含むものが面白いだろうと思ってこんなのを用意してみた。

CV_RETR_EXTERNAL

最外周の輪郭のみ抽出する

CV_RETR_LIST

全ての輪郭をフラットな(階層の無い)リスト構造に抽出する

CV_RETR_CCOMP

輪郭を外縁と内縁(穴)の二つの階層構造に抽出する

CV_RETR_TREE

全ての輪郭を木構造として抽出する

輪郭の階層を赤と青に分けているのでCV_RETR_CCOMPとCV_RETR_TREEの違いが分からないのは、私が無精をして色分けを外縁と内縁の二つにしか分けていないからだ。

なので、この二つをそれぞれ輪郭のレベルで色を分けてその色で輪郭を塗りつぶして(CV_FILLED)みたのが以下の結果だ。※

CV_RETR_CCOMP      CV_RETR_TREE

抽出している輪郭データは変わらないが、階層構造(色分け)が違うのが分かるだろうか。
それにしても上手く処理出来た時のcvFindContoursの輪郭抽出は素晴らしい。素材の殆どの文字と矩形が正しく認識されているのが解るだろう。

※これはいわゆる"ラベリング"処理に近いと思われる。