7

MacBook の iSight カメラを赤外線カメラに変換し、変換し、しきい値を設定するなど、大変な作業を行いました。現在、次のような画像が得られています。

代替テキスト

私の問題は今です。白いピクセルをグループ化して、画像に含まれるブロブの数を知る必要があります。cvBlob/を使用したくありませんcvBlobsLib。既に OpenCV にあるものを使用したいだけです。

ピクセルをループして、(しきい値を設定した) 接触している白いピクセルをチェックすることでそれらをグループ化できますが、おそらく OpenCV からこれを行うための本当に簡単な方法があると思いますか?

cvFindContoursこれは、「グループ」に分離するのではなく、すべての白いピクセルを 1 つの大きな配列で取得するため、使用できないと思います。誰でもお勧めできますか?(これらは円ではなく、小さな IR LED から放出された光であることに注意してください)

よろしくお願いします!
トムド

4

2 に答える 2

8

白いピクセルを探して画像をループします。遭遇したらcvFloodFill、そのピクセルをシードとして使用します。次に、各領域が異なる色になるように、すべての領域の塗りつぶし値を増やします。これをラベリングと呼びます。

于 2010-03-04T12:00:17.537 に答える
4

はい、でできますcvFindContours()。最初に見つかったシーケンスへのポインタを返します。そのポインターを使用して、見つかったすべてのシーケンスをトラバースできます。

    // your image converted to grayscale
    IplImage* grayImg = LoadImage(...);

    // image for drawing contours onto
    IplImage* colorImg = cvCreateImage(cvGetSize(grayImg), 8, 3);

    // memory where cvFindContours() can find memory in which to record the contours
    CvMemStorage* memStorage = cvCreateMemStorage(0);

    // find the contours on image *grayImg*
    CvSeq* contours = 0;
    cvFindContours(grayImg, memStorage, &contours);

    // traverse through and draw contours
    for(CvSeq* c = contours; c != NULL; c = c->h_next) 
    {
         cvCvtColor( grayImg, colorImg, CV_GRAY2BGR );
         cvDrawContours(
                        colorImg,
                        c,
                        CVX_RED,
                        CVX_BLUE,
                        0, // Try different values of max_level, and see what happens
                        2,
                        8
         );
    }

cvBlobsこの方法以外に、またはをご覧になることをお勧めしますcvBlobsLib。後者は、公式のブロブ検出ライブラリとして OpenCV 2.0 に統合されています。

于 2010-03-04T17:47:39.600 に答える