inRange查询图像输出

时间:2013-02-19 11:44:06

标签: opencv image-processing

我已经开始学习opencv并编写了下面的代码来获取hsv和inRange图像中图像(来自输入摄像头)的输出! hsv输出很好但是inRange o / p只是空白:|请帮助我难倒

int main(int argc[], char** argv[])
   {
VideoCapture camera(CV_CAP_ANY);
Mat input;
Mat output(Size(input.size().height,input.size().width),input.type());
Mat img_thresh(Size(640,480),input.type());

namedWindow("input",0);
namedWindow("output",0);
namedWindow("threshold",0);

cv::Scalar hsv_min = cvScalar(0, 30, 80, 0);
    cv::Scalar hsv_max = cvScalar(20, 150, 255, 0);

for(;;)
{
    camera >> input;

    cvtColor(input,output,CV_BGR2HSV,1);
    cv::inRange(input,hsv_min,hsv_max,img_thresh);  

    imshow("input",input);
    imshow("output",output);
    imshow("threshold",img_thresh);

    cv::waitKey(40);    
}

return 0;

}

1 个答案:

答案 0 :(得分:0)

将inRange函数应用于输入BGR图像。您必须将它应用于HSV图像,在您的代码中命名为输出。所以该行应该是:

cv::inRange(output,hsv_min,hsv_max,img_thresh);

您的代码正常运行,但您没有使用正确的图片!

如果您想了解图片中的HSV值,我建议您使用:

cvSetMouseCallback("input", getObjectColor);

并且:

void getObjectColor(int event, int x, int y, int flags, void *param = NULL) {

    // Vars
    CvScalar pixel;
    IplImage *hsv;

    if(event == CV_EVENT_LBUTTONUP) {

        // Get the hsv image
        hsv = cvCloneImage(image);
        cvCvtColor(image, hsv, CV_BGR2HSV);

        // Get the selected pixel
        pixel = cvGet2D(hsv, y, x);
        cvShowImage("getObjColor", hsv);
        // Change the value of the tracked color with the color of the selected pixel
        h = (int)pixel.val[0];
        s = (int)pixel.val[1];
        v = (int)pixel.val[2];
        cout << "Color HSV = h:" << pixel.val[0] << " | s:" << pixel.val[1] << " | v:" << pixel.val[2] << endl;

        // Release the memory of the hsv image
            cvReleaseImage(&hsv);
    } 
}

你需要创建一些变量来使这项工作,代码是从互联网上获取的(不记得在哪里!)