トップページ > コンテンツ > その他のAPI、ライブラリ関係 > Opencv関連 > ラベリング

色んな人が紹介しているが、http://chihara.naist.jp/people/STAFF/imura/products/labelingを使うのが楽そう。

実際に使ってみてはまったトラップ【その1】:

実装してみてopencvの仕様の謎が深まった。
「イメージの格納方法にはいくつかの種類があります。
通常扱うのは画像の上から格納するやり方(トップダウン)と下から格納するやり方(ボトムアップ)です。
cvCreateImageで作成したイメージはトップダウンです。」  
(http://www.geocities.co.jp/SiliconValley/7406/tips/opencv/opencv_1.htmlより一部引用)
とあるが、dst_bufの結果を表示しようとすると結果が上下反転するトラップがある模様。
今の所、
tmpにラベリング結果を格納し、
for(int y = 0; y < height; y++) {
   for(int x = 0; x < width; x++) {
	   dst[y*width + x] = tmp[(height -y -1)*width+x];
   }
}
みたいな感じで誤魔化し中。。。

実際に使ってみてはまったトラップ【その2】:

井村氏のラベリングは黒画素の部分を無視して白画素の部分を対象にラベリングする。
そのため黒画素の部分に対してはラベリング情報が得られない。
つまり、黒画素の部分にlabeling.GetNumOfRegions()は黒背景の白物体だったとしても
領域数2ではなく、領域数1と判定される。また、白物体を対象なので黒物体のラベリングをしたいときは
cvNot()を使って反転させないといけない。

実際に使ってみてはまったトラップ【その3】:

ラベリングできなかったものは領域番号0に格納される。つまり、実際の領域を追うには1から調べる必要
があった。labeling.GetNumOfResultRegions()は領域数2個で未分類1個[ラベリング番号0]でも
2を表示するが、labeling.GetResultRegionInfo(int変数)は1個目の領域[領域番号1]が0番目、
2個目の領域[領域番号2]が1番目になるので注意。

その他(ラベリングの隣接情報を取得するにはどうすればいいか考察。):

3*3のパターンを走査させてそのブロック内で異なるラベリング番号が現れたら、その番号は隣接している
と考えるのはどうか?
for(int y = 1; y < height - 1; y++) {
   for(int x = 1; x < height -1; x++) {
      if(8方向比較で異なるラベリング値) 配列に異なる2つのラベリング値格納。
   }
}
といったような感じ。

最終更新:2011年04月03日 18:53