在opencv中对颜色进行阈值处理

时间:2012-01-30 23:49:50

标签: opencv colors threshold

我正在尝试将我的程序设置为颜色的阈值(以BGR格式)。我还没有完全确定我要找的颜色。我还想让程序记录它检测到的那种颜色的像素数。到目前为止,我的代码如下,但它无效。

#include "cv.h"
#include "highgui.h"




int main()
{
 // Initialize capturing live feed from the camera
CvCapture* capture = 0;
capture = cvCaptureFromCAM(0);

// Couldn't get a device? Throw an error and quit
if(!capture)
{
    printf("Could not initialize capturing...\n");
    return -1;
}
 // The two windows we'll be using
cvNamedWindow("video");
cvNamedWindow("thresh");

 // An infinite loop
while(true)
{
    // Will hold a frame captured from the camera
    IplImage* frame = 0;
    frame = cvQueryFrame(capture);

            // If we couldn't grab a frame... quit
    if(!frame)
        break;


    //create image where threshloded image will be stored
    IplImage* imgThreshed = cvCreateImage(cvGetSize(frame), 8, 1);


    //i want to keep it BGR format. Im not sure what colour i will be looking for yet. this can be easily changed
    cvInRangeS(frame, cvScalar(20, 100, 100), cvScalar(30, 255, 255), imgThreshed);


    //show the original feed and thresholded feed
    cvShowImage("thresh", imgThreshed);
    cvShowImage("video", frame);

    // Wait for a keypress
    int c = cvWaitKey(10);
    if(c!=-1)
    {
        // If pressed, break out of the loop
        break;
    }

    cvReleaseImage(&imgThreshed);
}
cvReleaseCapture(&capture);
return 0;

}

2 个答案:

答案 0 :(得分:3)

要获得颜色的阈值,

1)将图像转换为HSV

2)然后应用cvInrangeS

3)获得阈值图像后,您可以计算其中的白色像素数。

尝试使用本教程跟踪黄色:Tracking colored objects in OpenCV

答案 1 :(得分:2)

我可以告诉你如何在Python和C ++中使用和不使用和转换为HSV。

C ++版本(转换为HSV)

  1. 将图像转换为HSV图像:

    // Convert the image into an HSV image IplImage* imgHSV = cvCreateImage(cvGetSize(img), 8, 3); cvCvtColor(img, imgHSV, CV_BGR2HSV);

  2. 创建一个新图像,用于保存带图像的图像:

    IplImage* imgThreshed = cvCreateImage(cvGetSize(img), 8, 1);

  3. 使用cvInRangeS进行实际阈值处理

    cvInRangeS(imgHSV, cvScalar(20, 100, 100), cvScalar(30, 255, 255), imgThreshed);

  4. 这里,imgHSV是参考图像。并且两个cvScalars表示颜色为黄色的值的下限和上限。 (这些边界几乎适用于所有条件。如果不是,请尝试尝试最后两个值。)

    考虑任何像素。如果该像素的所有三个值(H,S和V,按此顺序)位于所述范围内,则imgThreshed在该对应像素处获得值255。对所有像素重复此操作。所以你最终得到的是一个阈值图像。

    1. 使用countNonZero计算阈值图像中的白色像素数。
    2. Python版(不转换为HSV):

      1. 以Numpy数组格式创建您感兴趣的范围的下边界和上边界(注意:您需要使用import numpy as np
      2. lower = np.array((a,b,c), dtype = "uint8") upper = np.array((x,y,z), dtype = "uint8")

        在上面(a,b,c)是下限,(x,y,z)是上限。

        2.获取满足范围的像素的掩码:

        mask = cv2.inRange(image, lower, upper)

        在上文中,image是您想要工作的图像。

        1. 使用countNonZero计算蒙版中存在的白色像素数:
        2. yellowpixels = cv2.countNonZero(mask) print "Number of Yellow pixels are %d" % (yellowpixels)

          来源: