2011-08-21 21 views
2

我正在嘗試使用cvblob檢測對象。不知何故,我的代碼只標記白色物體。如何標記其他顏色的物體,如一罐啤酒或一瓶水。opencv 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

這是默認的選項,你不能改變它,如果你不cvblob庫更改源代碼。

如果你真的想改變這很容易,你可以創建一個相同方法的副本,像CvScalar一樣添加一個新的輸入變量來選擇輸出顏色。它是如此容易。

cvRenderBlob方法將在cvcontour.cpp中。

我已經在cvblob庫中做了很多改進,並且在接下來的幾個月裏我會將它推送給創作者。

+0

這是一個解決方案。我現在會這樣做。謝謝 – hoyomi

0

嘗試增加:

「cvInRangeS(hsvframe,cvScalar(23,41,133),cvScalar(40150255),threshy);對於黃色//」

過濾斑點之前。它的一系列HSV(而不是RGB)值定義了所需顏色的閾值。

希望它有幫助。