2013-02-19 58 views
0

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

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; 

}

+0

您的代码在我的电脑工作。尝试使用不同的hsv_min和hsv_max值。 – Haris 2013-02-19 12:14:02

+0

确定ty将尝试:)哦,并且你可以只发布屏幕快照:)的inRange输出? ! – 2013-02-21 06:31:19

回答

0

您应用INRANGE功能输入BGR图像。您必须将其应用于HSV图像,在代码中将其命名为output。所以行应该是:

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); 
    } 
} 

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