2011-01-09 35 views
13

私はOpenCVを使用して特定の色の画像をフィルタリングしているので、検出された領域のバイナリ画像が得られました。OpenCVでブロブ抽出

今、私は最高のライブラリがどうなるかについての勧告を探していた最大の「ブロブ」

のy座標、それらの領域を侵食して、小さいものを取り除く、およびXを見つけたいです使用する?私はcvBlobとcvBlobsLibを見たことがありますが、私はそれらを設定する方法があまりよく分かりません。プロジェクトと一緒にコンパイルしたいのですか(OpenCVのように)コンパイルしてシステムにインストールしたいのですか?

(つまり、物事を制限するべきではありませんが)私は現在、残念ながら、OpenCVのは、深刻な漏れのように思える任意の連結成分ラベリング機能を持っていないのUbuntu上

答えて

11

私はパーティーに遅れていますが、私はopencvで接続されたコンポーネントを実行する方法があるとチャイムしたいと思います。

更新:これは主に、3.0が複数年にわたってリリースされるのを待っているだけです。 Linky to documentation

http://code.opencv.org/issues/1236http://code.opencv.org/attachments/467/opencv-connectedcomponents.patch

免責事項を参照してください - 私は著者です。

+2

ニースの仕事Jason。私はあなたのパッチを統合しました。それはうまくいくようです。スピードも良いです。たぶんいくつかのプロパティー機能を追加することも大変です(エリア、セントロイドなど)。とにかく、偉大な仕事に感謝します。 OpenCVチームがすぐにあなたのパッチを統合してくれることを願っています。これはOpenCV IMHOの深刻な欠如です。特に、他の図書館が古く、IplImage * ... –

+0

+1しか使用していないためです。よくできました。 OpenCVにどのようにパッチを統合するのですか? – Alexey

+0

これは現在のAPIですか?はいの場合は、ドキュメントへのリンクが将来の読者に役立つでしょう。 – dashesy

10

をコード::ブロックIDEを使用していますコンピュータビジョンライブラリ。とにかく私は最近同様の要件を持っていましたので、独自のCCLルーチンを実装しました。CCL Wikipedia pageに記載されているいくつかの異なるアルゴリズムがあり、どちらも実装が簡単です。

+1

これは最高の選択肢だと思われます。ありがとう:) OpenCVの部分については、大した見落としがあるようです。 – amr

+0

OpenCVサイト(cvBlobsLibなど)にサードパーティのBLOBライブラリがありますが、それを見て、コードの品質はあまり良くありませんでした。このインスタンスで自分自身をロールする方がいいと思います。 –

+0

別の答えで言及したように、FindContoursは接続コンポーネントのラベル付けに相当するものを見つけられませんか? – carnieri

11

findContoursを使用すると、opencv manualTutorial to find connected componentsをご覧ください。


編集:(Archive.org経由)チュートリアルからコード

#include <stdio.h> 
#include <cv.h> 
#include <highgui.h> 

int main(int argc, char *argv[]) 
{ 
    IplImage *img, *cc_color; /*IplImage is an image in OpenCV*/ 
    CvMemStorage *mem; 
    CvSeq *contours, *ptr; 
    img = cvLoadImage(argv[1], 0); /* loads the image from the command line */ 
    cc_color = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3); 

    cvThreshold(img, img, 150, 255, CV_THRESH_BINARY); 
    mem = cvCreateMemStorage(0); 
    cvFindContours(img, mem, &contours, sizeof(CvContour), CV_RETR_CCOMP, 
     CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 


    for (ptr = contours; ptr != NULL; ptr = ptr->h_next) { 
     CvScalar color = CV_RGB(rand()&255, rand()&255, rand()&255); 
     cvDrawContours(cc_color, ptr, color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0)); 
    } 

    cvSaveImage("result.png", cc_color); 
    cvReleaseImage(&img); 
    cvReleaseImage(&cc_color); 
    return 0; 
} 
+0

これは、最大の輪郭/ブロブを見つける方法を見ても有望そうに見える - ありがとう:) – amr

+0

私はあなたが輪郭の面積を計算することができると思います。それにはいくつかの機能があります。 –

+0

私はちょうど輪郭の境界ボックスの面積を計算しました。それは仕事をしました – amr

0

私はOpenCVのと、ブロブと連携するための最良かつ簡単なオプションがcvBlobライブラリを使用することだと思います。そのOpenCVを持つ補完的なライブラリはとても使いやすいものです。

関連する問題