2013-07-04 183 views
1

我想通过一个网络摄像头同时跟踪具有不同颜色的多个对象。现在我可以做到单一门槛的单一颜色:各种阈值

IplImage* GetThresholdedImage(IplImage* imgHSV) 
{  
    IplImage* imgThresh=cvCreateImage(cvGetSize(imgHSV),IPL_DEPTH_8U, 1); 
    cvInRangeS(imgHSV, cvScalar(170,160,60), cvScalar(180,2556,256), imgThresh); 
    return imgThresh; 
} 

我正在寻找一些提示做各种阈值。如果可能的话,它需要多少个窗口?我是否需要为不同的颜色分配不同的窗口?

+1

做最简单的方法,这是对每种颜色创建一个阈值的图像你想跟踪。你可以修改'GetThresholdedImage()'获取'cvScalar'参数的上限和下限,然后为每个对象调用一次。 – Aurelius

+0

你可以有点特定? – yxing

+0

错误:函数“cvScalar”不是类型名称? – yxing

回答

0

最简单的方法是为每个想要跟踪的颜色创建一个阈值图像。您可以修改您的函数,将它们作为参数来代替对阈值范围进行硬编码。这使您可以为不同的对象重新使用该功能。

修改的功能可能是这样的:

IplImage* GetThresholdedImage(IplImage* imgHSV, CvScalar lower, CvScalar upper) 
{  
    IplImage* imgThresh=cvCreateImage(cvGetSize(imgHSV),IPL_DEPTH_8U, 1); 
    cvInRangeS(imgHSV, lower, upper, imgThresh); 
    return imgThresh; 
} 

,然后使用不同的阈值对不同的对象调用它:

IplImage* hsv; /* Already initialized*/ 

/* Set thresholds for blue and green objects as an example. */ 
/*Obviously, set these to be whatever is necessary. */ 
CvScalar blue_lower = cvScalar(110,60,10); 
CvScalar blue_upper = cvScalar(120,256,256); 
CvScalar green_lower = cvScalar(40,60,10); 
CvScalar green_upper = cvScalar(71,256,256); 

/* Get the images thresholded for blue and green. */ 
IplImage* blue_mask = GetThresholdedImage(hsv, blue_lower, blue_upper); 
IplImage* green_mask = GetThresholdedImage(hsv, green_lower, green_upper);