我已经开始学习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;
}
答案 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);
}
}
你需要创建一些变量来使这项工作,代码是从互联网上获取的(不记得在哪里!)