HSV颜色空间与人眼较为接近,一般以HSV为颜色检测和识别
H--色调(红-绿-蓝)
S--饱和度(颜色深浅)
V-亮度(颜色亮暗)
opencv H范围(0-180) S(0-255) V(0-255)
HSV二值化处理的函数CV_EXPORTS_W void inRange(InputArray src, InputArray lowerb,InputArray upperb, OutputArray dst);
第一个参数是输入图像
第二个参数是低阈值
第三个参数是高阈值//高低阈值指的是hsv的高低阈值,当图像的hsv在高低阈值之间那么输出图像为255白,否则为0
第四个参数是输出图像(大小与输入图像一样,类型是8U)Mat dstImage=Mat::zeros(srcImage.size(),CV_8U);
代码
#include "opencv2/opencv.hpp"
#include "iostream"
using namespace cv;
using namespace std;
int h_min=156;
int s_min=97;
int v_min=159;
int h_max=180;
int s_max=255;
int v_max=255;
void main()
{
Mat srcImage=imread("strawberry4.jpg");
imshow("src",srcImage);
Mat tempImage=srcImage.clone();
cvtColor(srcImage,srcImage,CV_BGR2HSV);
Scalar hsv_min(h_min,s_min,v_min);
Scalar hsv_max(h_max,s_max,v_max);
Mat dstImage=Mat::zeros(srcImage.size(),CV_8U);
inRange(srcImage,hsv_min,hsv_max,dstImage);
Mat element=getStructuringElement(MORPH_RECT,Size(5,5));
morphologyEx(dstImage,dstImage,MORPH_ERODE,element,Point(-1,-1),1);
morphologyEx(dstImage,dstImage,MORPH_DILATE,element,Point(-1,-1),4);
imshow("dst",dstImage);
vector
findContours(dstImage,contours,RETR_EXTERNAL,CHAIN_APPROX_NONE);
vector
for(int i=0;i
rect[i]=boundingRect(contours[i]);
int x=rect[i].x;
int y=rect[i].y;
int width=rect[i].width;
int height=rect[i].height;
rectangle(tempImage,Point(x,y),Point(x+width,y+height),Scalar(0,255,0),2);
}
imshow("result",tempImage);
waitKey(0);
}
其中的hsv阈值需要自己用滑动条来确定使用的范围