スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[OpenCV] ラベリングライブラリの比較

OpenCVのラベリング処理について調べてみました
OpenCVにはラベリング処理が入っていないみたい。

でも、フリーで幾つかライブラリが提供されているみたいです。
なので、ラベリング処理のライブラリを簡単に2つほど紹介します。

ちなみに環境はVC++です。


cvBlobsLib

"OpenCV labeling"で調べるといっぱい出てくるので、標準っぽいものです。
cvBlobsLibからダウンロードします。
私が使ってみた感想を書きます。
あんまり詳しく見ていないので(というか英語じゃないから見れない。。。)
間違ってたらすみません。

  • 英語じゃない(ちょっと英語)

  • VCでビルドし、インクルードできる。

  • 処理は速い。(計測値は出せませんが、速いと思います)

  • 結構簡単に書ける。

  • ラベリングされたオブジェクトの最大、最小、中心のXYが取れます。

  • ラベリングのポイントリストが取れない


とこんな感じです。
私としては、ラベリングのポイントリストを取って色々処理をしたかったので、
取れなかったことが残念ですが、FillBlob()という関数で、ラベリング値毎に
色付けできるので、一度色付けした後、その色を取り出すという処理、、、
をすればいいのかと。。。 (File I/Oも入るし、かなり二度手間、、、)



Labeling.h

これは、日本の方が作っているものです。
OpenCV/ラベリング
ラベリング手法
で紹介されている方だと思います。(ただしurlが変わっているようです)
ここのサイトから、ダウンロードできます。
使ってみた感想ですが、

  • 日本語だからやりやすい

  • VCで使える。

  • ヘッダを追加するだけなので直ぐ使える。

  • 親切なサンプルがある。(これは嬉しい)

  • ソースコードが読みやすい。(変にオブジェクト化していない)

  • ラベリングリストも取れる(結果が親切w)

  • IplImage渡しではないので、処理が面倒


とこんな感じです。
unsigned charのバッファに二値画像の値を入れて処理を行うため、ちょっと面倒です。
速度については調べていませんが、一度画像を読込み、バッファに入れ込む処理を考えると、ループが2つ増える印象を受けます。
しかし、使いやすさは、多少面倒な前処理、後処理が入りますが、処理が把握しやすいため、cvBlobsLibより使いやすい印象を受けました。


ということで、サポートやライセンスは、どちらも同じようなものなので、
私としては、Labeling.hを使ったほうがいいと思いました。
(構造がわかりやすいですし、バグがあっても修正が簡単そうなので)


終わり。







スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

OpenCVで、基本とかBGR-> HSV変換

久々にOpenCVをいじって、忘却の彼方にいってしまっていたので、外部記録しておきます。

[とっても基本的なこと]
IplImage   --- 画像のポインタ
cvほにゃほにゃ       ---  ほにゃほにゃを行う関数。

[画像の読込み]
// BGRの順で読み込まれます。
IplImage* bgrimg = cvLoadImage("画像パス");
// ピクセルの値を取得。 Point(x,y) = (100,100)の場合
int x =100;
int y = 100;
int B = 0;
int G = 1;
int R = 2;
uchar p[3]
p[0] =  hsvimg->imageData[hsvimg->widthStep * y + x * 3 + B];
p[1] =  hsvimg->imageData[hsvimg->widthStep * y + x * 3 + G];
p[2] =  hsvimg->imageData[hsvimg->widthStep * y + x * 3 + R];

[BGR -> HSV変換 , HSV->BGR変換]
// BGRの順で読み込まれます。
IplImage* bgrimg = cvLoadImage("画像パス");

// HSVを格納するオブジェクトの作成
IplImage* hsvimg = cvCreateImage(cvGetSize(bgrimg),IPL_DEPTH_8U,3);

// BGR -> HSV 変換
cvCvtColor(bgrimg,hsvimg,CV_BGR2HSV);

// HSVの値を取得。 Point(x,y) = (100,100)の場合
int H = 0;
int S = 1;
int V = 2;
uchar p[3]
p[0] = hsvimg->imageData[hsvimg->widthStep * y + x * 3 + H];
p[1] = hsvimg->imageData[hsvimg->widthStep * y + x * 3 + S];
p[3] = hsvimg->imageData[hsvimg->widthStep * y + x * 3 + V];

// HSV -> BGR 変換
IplImage* bgrimg2 = cvCreateImage(cvGetSize(hsvimg),IPL_DEPTH_8U,3);
cvCvtColor(hsvimg,bgrimg2,CV_HSV2BGR);
ここで、値の範囲は、
 0 <= R , G , B <= 255
 0 <= H , S , V <= 255  
となります。
普通HSVは、
0 <= H <= 360
0 <= S <= 1.0
0 <= V <= 1.0
ですが、  OpenCVでは、値が以下のように変換されています。
本当のH = H  * 2
本当のS = double(S) / 255.0
本当のV = double(V) / 255.0
つまり、Hは、360°の半分として、S,Vは255レンジで出力されています。
これは、8bitに合わせる為です。

また、cvCvtColorは、第二引数により、色々変換できます。
以下の本に詳しく載っています。





終わり。

テーマ : プログラミング
ジャンル : コンピュータ

プロフィール

ss_9

名前 :ss_9
紹介 :
20代はエンジニア、30代はプロ、40代は管理、50代は人脈。

Twitterボタン

最新記事
カテゴリ
AD
月別アーカイブ
RSSリンクの表示
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。