opencv cvblob - рендеринг капель, отличных от белого - PullRequest
2 голосов
/ 21 августа 2011

Я пытаюсь обнаружить объекты с помощью 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;

    }
}

Любой отзыв приветствуется.

Мило

Ответы [ 2 ]

4 голосов
/ 22 августа 2011

Это опция по умолчанию, и вы не можете изменить ее, если не измените исходный код в библиотеке cvblob.

Если вы действительно хотите изменить это так просто, вы можете создать копию того же метода, добавив новую переменную ввода, например CvScalar, для выбора цвета вывода. Это так просто.

Метод cvRenderBlob будет находиться в cvcontour.cpp.

В библиотеку cvblob было внесено много улучшений, и в следующие месяцы я передам ее создателю.

0 голосов
/ 03 марта 2012

Попробуйте добавить:

"cvInRangeS (hsvframe, cvScalar (23,41,133), cvScalar (40,150,255), молотильный); // для желтого"

Перед фильтрацией BLOB-объектов. Это диапазон значений HSV (вместо RGB), который определяет порог желаемого цвета.

Надеюсь, это поможет.

...