2010-11-28

【OpenCV】ラベリング処理ライブラリcvblobの導入

しばらくブログ放置してた(;´∀`)

社内ネットワーク上ではブログ支部つくって、
毎日書き込んでるんだけどなw

今回は、OpenCVについて。 OpenCVは超便利なC言語ベースの画像処理ライブラリ。
自分も学生時代にはよくお世話になりました。

マジOpenCV様、救いの神様。

でも、実はこいつには一つ問題があって・・・
未だに「ラベリング処理」が実装されていない。

ラベリングなんて、画像処理の基本中の基本じゃね?
とか思うんだけど、なんで入ってないんだろうね・・・
で、それに不満を持つ人達がすでにいくつかライブラリを提供しているわけです。
これに便乗しない手はない。

今回はその中でも、cvblobを紹介。
(cvBlobsLibとかいうのもあったんだけど、イマイチ使い方分からないんだよねw
解説ブログも情報が古くて対応してないみたいだった・・・)

ライブラリはここから → http://code.google.com/p/cvblob/

でも、バイナリが用意されてないので、自分でコンパイルする。
Linuxならそのままmakeでいいんだけど、VC++環境でやる場合にはCMakeをしなくちゃならない。

で、めんどーながらもCMake、CV++用のプロジェクトファイルを作成。
後は、OpenCVのライブラリパスを通して、CV++でビルドすればいいんだが、
なんとこいつ、ビルドでコケやがったwww

fatal error C1083: include ファイルを開けません。'sys/time.h': No such file or directory
あ、sys/time.hって、Linux環境でしか使えないのか・・・なんのためのCMakeなんだよwww
まあ、サンプルソースみたいだからこれ単体がビルド通らなくても問題ないけどさ・・・ちゃんとビルドは通そうよ。
ということで、VC++環境で動作するようにソースを以下のように変更でゲソ。
//代わりにこっち
//#include <"sys/time.h">
#include <"sys/types.h">
#include <"sys/timeb.h">
//timeval ==> _timebに入れ替え
//int diff_ms(timeval t1, timeval t2)
int diff_ms(_timeb t1, _timeb t2)
{
    //return (((t1.tv_sec - t2.tv_sec) * 1000000) + (t1.tv_usec - t2.tv_usec) + 500)/1000;
    return (((t1.time - t2.time) * 1000000) + (t1.time - t2.time) + 500)/1000;
}
さらにmain関数内で、
int main()
{
   ………
    //timeval tim1;
    //gettimeofday(&tim1, NULL);
    _timeb tim1;
    _ftime(&tim1);
    unsigned int result = cvLabel(randomBinImg, labelImg, blobs);
    //timeval tim2;
    //gettimeofday(&tim2, NULL);
    _timeb tim2;
    _ftime(&tim2);
   ………
とする。これでビルドが通るんじゃなイカ?

実行結果。



ふーん。
1000msecごとにランダムにノイズをつくって、その画像のラベリングをしているっぽい。
時々、0msecになってるのは使ってるPCがしょぼいからです、ごめんなさい。

ついでにもう一つサンプル(test.cpp)があったので実行してみる。
こっちはサンプルの原画像から、ラベリングを行った結果を返すプログラムらしい。



結果を見る限り、面積だけでなく、重心やx,y位置での最小最大位置、平均色なども取得できるみたいね。


ふーとりあえず、これで自由にcvblobが使えるようになったわけですね。
インクルードするヘッダはcvBlobフォルダ以下のものをコピーすればよし。
あとは、ビルド時に生成されたcvblob.libをリンクする。場所はCMakeで事前に指定した先にある。

細かいライブラリの使い方については、またあとで。