2

cvblob でオブジェクトを検出しようとしています。どういうわけか、私のコードは白いオブジェクトのみをマークします。ビールの缶や水のボトルなど、他の色のオブジェクトをマークする方法。

これが私のコードです:

#include "highgui.h"
#include "cv.h"
#include "cvaux.h"
#include "iostream"
#include <stdio.h>
#include <ctype.h>

#include <cvblob.h>

using namespace cv;
using namespace std;
using namespace cvb;

int main(int argc, char** argv) {
    CvTracks tracks;

    cvNamedWindow("frame", CV_WINDOW_AUTOSIZE);
    cvMoveWindow("frame", 50, 100);

    CvCapture* capture;

    IplImage* frame = 0;

    capture = cvCreateCameraCapture( 0 ); //capture frames from cam on index 0: /dev/video0/

    if (!capture) {
        return -1;
    }

    cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 320);
    cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 240);

    frame = cvQueryFrame(capture);

    while(frame) {
        IplImage *gray = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1);
        cvCvtColor(frame, gray, CV_BGR2GRAY);
        cvThreshold(gray, gray, 150, 255, CV_THRESH_BINARY);

        IplImage *labelImg=cvCreateImage(cvGetSize(gray), IPL_DEPTH_LABEL, 1);
        CvBlobs blobs;
        unsigned int result=cvLabel(gray, labelImg, blobs);

        cvFilterByArea(blobs, 500, 1000000);
//        cvRenderBlobs(labelImg, blobs, frame, frame, CV_BLOB_RENDER_BOUNDING_BOX);
        cvRenderBlobs(labelImg, blobs, frame, frame, CV_BLOB_RENDER_CENTROID);
        cvUpdateTracks(blobs, tracks, 200., 5);
        cvRenderTracks(tracks, frame, frame, CV_TRACK_RENDER_ID|CV_TRACK_RENDER_BOUNDING_BOX);


        for (CvBlobs::const_iterator it=blobs.begin(); it!=blobs.end(); ++it) {
            cout << "Blob #" << it->second->label << ": Area=" << it->second->area << ", Centroid=(" << it->second->centroid.x << ", " << it->second->centroid.y << ")" << endl;
        }

        cvShowImage("frame", frame);

        cout << "----------------------------" << endl;

        frame = cvQueryFrame(capture);

        char c = cvWaitKey(10);
        if(c==27)
            break;

    }
}

どんなヒントでも大歓迎です。

ミロ

4

2 に答える 2

4

これはデフォルトのオプションであり、cvblob ライブラリのソース コードを変更しない限り変更できません。

これを本当に簡単に変更したい場合は、CvScalar のような新しい入力変数を追加して同じメソッドのコピーを作成し、出力色を選択できます。非常に簡単。

メソッド cvRenderBlob は cvcontour.cpp にあります。

私は cvblob ライブラリで多くの改善を行ってきました。来月には作成者にプッシュします。

于 2011-08-22T08:00:58.073 に答える
0

追加してみてください:

"cvInRangeS(hsvframe,cvScalar(23,41,133),cvScalar(40,150,255),threshy);//黄色の場合"

ブロブをフィルタリングする前。目的の色のしきい値を定義する HSV (RGB ではなく) 値の範囲です。

それが役に立てば幸い。

于 2012-03-02T22:05:24.763 に答える