About BBS

その他

作成者: 怡土順一, 最終変更者: 怡土順一, 最終変更リビジョン: 342, 最終変更日時: 2007-10-14 23:39:34 +0900 (日, 14 10月 2007)
This is a local copy taken at 2010/09/20. CLICK HERE to the original page at opencv.jp.

■ ラベリング

OpenCV自体には(OpenCV-1.0.0 時点において)ラベリングを行う関数は存在しないが, OpenCV Library Wikiで紹介されている"Blob extraction library"を利用して,画像のラベリングを行うことができる. このライブラリは,MIL(Matrox Imaging Library)における,MIL blob detection モジュールの機能を代替するものを,OpenCVを利用して実装してある. Win32環境で動作するものと,Linux環境で動作するものが,それぞれ配布されている. デフォルトでは,スタティックライブラリ(.lib あるいは .a)の形式で提供されるが,ソースからダイナミックリンク(あるいは,共有)ライブラリを作成することもできる. blobとは,データベースでいうところの型ではなく,"小さな塊"という 意味で用いられている(コンピュータグラフィックスやビジョンの世界では,メタボールを表現する際に用いられたりもする). つまり,画像中から個別の小さな塊(blob)を抽出する作業(≈ラベリング) を行うためのクラスであり,以下の特徴がある(詳細は,上述のホームページを参照すること).

サンプル


ラベリング CBlobResult

入力画像に対してラベリングを行い,面積と周囲長を表示する

サンプルコード

#include <cv.h> #include <highgui.h> #include "BlobResult.h" int main (int argc, char **argv) { int i; IplImage *src_img = 0, *dst_img = 0; CBlobResult blobs; CBlob blob; CvPoint p1, p2; CvFont font; char text[64]; CBlob blobWithBiggestPerimeter, blobWithLessArea; // (1)画像を読み込む if (argc != 2 || (src_img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR)) == 0) return -1; dst_img = cvCreateImage (cvSize (src_img->width, src_img->height), IPL_DEPTH_8U, 1); cvCvtColor (src_img, dst_img, CV_BGR2GRAY); cvInitFont (&font, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.5, 0, 1, CV_AA); // (2)ラベリングを行う blobs = CBlobResult (dst_img, NULL, 100, false); // (3)面積でフィルタリング blobs.Filter (blobs, B_INCLUDE, CBlobGetArea (), B_INSIDE, 1000, 50000); for (i = 0; i < blobs.GetNumBlobs (); i++) { // (4)各blobの最小包含矩形(傾き無し)を求める blob = blobs.GetBlob (i); p1.x = (int) blob.MinX (); p1.y = (int) blob.MinY (); p2.x = (int) blob.MaxX (); p2.y = (int) blob.MaxY (); // (5)各blobの包含矩形,インデックス,面積,周長を描画 cvRectangle (src_img, p1, p2, CV_RGB (255, 0, 0), 2, 8, 0); sprintf (text, "[%d] %d,%d", blob.Label (), (int) blob.area, (int) blob.Perimeter ()); cvPutText (src_img, text, cvPoint (p1.x, p1.y - 5), &font, cvScalarAll (255)); } // (6)最大の周長を持つblobを,緑色で塗りつぶす blobs.GetNthBlob (CBlobGetPerimeter (), 0, blobWithBiggestPerimeter); blobWithBiggestPerimeter.FillBlob (src_img, CV_RGB (0, 255, 0)); // (7)最小の面積を持つblobを,青色で塗りつぶす blobs.GetNthBlob (CBlobGetArea (), blobs.GetNumBlobs () - 1, blobWithLessArea); blobWithLessArea.FillBlob (src_img, CV_RGB (0, 0, 255)); // (8)画像を表示,キーが押されたときに終了 cvNamedWindow ("Labeling", CV_WINDOW_AUTOSIZE); cvShowImage ("Labeling", src_img); cvWaitKey (0); cvDestroyWindow ("Labeling"); cvReleaseImage (&src_img); cvReleaseImage (&dst_img); return 0; }

// (1)画像を読み込む
入力画像を,カラー画像として読み込む.また,ラベリング対象となる画像は, グレースケールあるいは二値画像である必要があるので,画像の変換を行う.

// (2)ラベリングを行う
1番目の引数に,ラベリング対象となる画像を与える. 2番目の引数は,マスク画像,3番目の引数は,blobかそれ以外かを決める閾値(0-255), 4番目の引数は,各blobモーメントの計算を行うか否かのフラグである. 戻り値として,オブジェクトCBlobResultを返す.

// (3)面積でフィルタリング
Filter()メソッドは,指定されたプロパティにより,blobをフィルタリングする. 1番目の引数は,前のラベリング処理で得られたオブジェクト. 2番目の引数は,フィルタリング作業(条件に当てはまったblobを,含む"B_INCLUDE"か,含まない"B_EXCLUDE"か). 3番目の引数は,フィルタリングに用いるプロパティを決定する関数. 4番目の引数は,フィルタリング条件(B_EQUAL,B_NOT_EQUAL,B_GREATER,B_LESS,B_GREATER_OR_EQUAL,B_LESS_OR_EQUAL,B_INSIDE,B_OUTSIDE) 5番目と6番目の引数は,下限および上限(これは,指定されないこともある)となる閾値.
今回は,面積が,1000 - 50000 [pixel] の範囲にあるblobだけを残している.

// (4)各blobの最小包含矩形(傾き無し)を求める
各blobにおいて最小,最大のx,y座標をもつピクセルを参照することで,そのblobを包含する矩形を求める.

// (5)各blobの包含矩形,インデックス,面積,周囲長を描画
各blobの包含矩形,およびblobインデックス,面積,周囲長を描画する. ここで,blobの周囲長は,blobの境界となるピクセルの個数であり, Edges()メソッドにより参照(CvSeq*型)できる. ただし,これらのピクセルは,ラスタースキャンされた際の走査順に並んでいるだけなので,そのまま輪郭を描く事はできない.

// (6)最大の周囲長を持つblobを,緑色で塗りつぶす
CBlobGetPerimeter()によって得られたblobの周囲の長さが,最大(0番目)のものを, CBlobオブジェクトとして取得し,FillBlob()メソッドによって塗りつぶす.

// (7)最小の面積を持つblobを,青色で塗りつぶす
(6)と同様に,CBlobGetArea()によって得られたblobの面積が,最小 (blobs.GetNumBlobs()-1番目,つまり最後)のものを, CBlobオブジェクトとして取得し,FillBlob()メソッドによって塗りつぶす.

// (8)画像を表示,キーが押されたときに終了
画像を実際に表示し,何かキーが押されるまで待つ.

実行結果例

[左]処理前 [右]処理後

OpenCV-1.0 リファレンス マニュアル
OpenCV-1.1pre リファレンス マニュアル
OpenCVサンプルコード


画素値の直接操作
部分画像のシャッフル
画像の連結
画像のコピー
画像形状の変形
タイリング
画像の反転
逆行列(擬似逆行列)の計算
色空間の写像
離散フーリエ変換
階層構造を持つ輪郭の座標取得
図形の描画
ポリゴンの描画
凸ポリゴンの描画
テキストの描画
IplImage構造体情報の保存
マップのシーケンスを保存
IplImage構造体情報の読み込み
マップのシーケンスを読み込む
K-means法によるクラスタリング
クラスタリングによる減色処理
エッジの検出
コーナーの検出
並進移動のためのピクセルサンプリング
回転移動のためのピクセルサンプリング
画像のサイズ変更
画像のアフィン変換(1)
画像のアフィン変換(2)
画像の透視投影変換
全方位画像の透視投影変換
モルフォロジー変換
平滑化
ユーザ定義フィルタ
境界線の作成
画像の二値化
画像の二値化(大津の手法)
画像ピラミッドの作成
画像ピラミッドを用いた画像の領域分割
平均値シフト法による画像のセグメント化
Watershedアルゴリズムによる画像の領域分割
輪郭の検出と描画
画像のモーメントを計算
ハフ変換による直線検出
ハフ変換による円検出
距離変換とその可視化
不要オブジェクトの除去
ヒストグラムの描画
ヒストグラム間の距離
二次元のヒストグラム
バックプロジェクションパッチ
ヒストグラムの均一化
テンプレートマッチング
形状のマッチング
点列を包含する矩形
輪郭領域の面積と輪郭の長さ
二つの矩形を包含する矩形
楕円のフィッティング
点列を包含する図形
動的背景更新による物体検出
snakeによる輪郭追跡(静止画)
オプティカルフロー1
オプティカルフロー2
オプティカルフロー3
Condensation
顔の検出
カメラキャリブレーション
歪み補正
マップを利用した歪み補正
サポートベクターマシン
画像の各ピクセル値を特徴ベクトルとしたSVMの学習
画像の各ピクセル値を特徴ベクトルとしたSVMによる物体検出
マウスイベントの取得
トラックバーの利用
カメラからの画像キャプチャ
動画としてファイルへ書き出す
ラベリング