OpenCV:createTrackbar()函数搭配inRange()函数精确选取想要的HSV二值化区域。

OpenCV小技巧

运用滑动条调节二值化区域


一、createTrackbar()函数

createTrackbar( const string& trackbarname, 
				const string&winname,
 				int* value, 
 				int count ,
				TrackbarCallback onChange = 0,  
 				void* userdata = 0); 

trackbarname:轨迹条名字

winname:窗口名字

value:滑块初始位置

count :表示滑块达到最大位置的值

onChange :默认值为0,指向回调函数

userdata :默认值为0,用户传给回调函数的数据值

二、inRange()函数

inRange(InputArray src, 
		InputArray lowerb,
        InputArray upperb, 
        OutputArray dst);

src:输入要处理的图像,可以为单通道或多通道。
lowerb:包含下边界的数组或标量。
upperb:包含上边界数组或标量。
dst:输出图像,与输入图像src 尺寸相同且为CV_8U 类型。

三、代码

#include
#include
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
#include 
#include

using namespace cv;
using namespace std;

Mat dst1;
Mat frame;
Mat dst2;
Mat hsv;

int LH = 166;
int LS = 43;
int LV = 46;
int HH = 180;
int HS = 240;
int HV = 240;


void onLH(int, void*)
{
	inRange(hsv, Scalar(LH, LS, LV), Scalar(HH, HS, HV), dst2);					//二值化处理
	imshow("2", dst2);
}
void onLS(int, void*)
{
	inRange(hsv, Scalar(LH, LS, LV), Scalar(HH, HS, HV), dst2);					//二值化处理
	imshow("2", dst2);
}
void onLV(int, void*)
{
	inRange(hsv, Scalar(LH, LS, LV), Scalar(HH, HS, HV), dst2);					//二值化处理
	imshow("2", dst2);
}
void onHH(int, void*)
{
	inRange(hsv, Scalar(LH, LS, LV), Scalar(HH, HS, HV), dst2);					//二值化处理
	imshow("2", dst2);
}
void onHS(int, void*)
{
	inRange(hsv, Scalar(LH, LS, LV), Scalar(HH, HS, HV), dst2);					//二值化处理
	imshow("2", dst2);
}
void onHV(int, void*)
{
	inRange(hsv, Scalar(LH, LS, LV), Scalar(HH, HS, HV), dst2);					//二值化处理
	imshow("2", dst2);
}

int main()
{
	frame=imread("填入图片地址");
	//创建窗口
	namedWindow("1",0);
	resizeWindow("1", 500, 500);
	namedWindow("2", 0);
	resizeWindow("2", 500, 500);

	imshow("1",frame);

//cvCvtColor(...),是Opencv里的颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间的转换
//CV_BGR2HSV将图片从RGB空间转换为HSV空间。
	cvtColor(frame, hsv, COLOR_BGR2HSV);   
							
	
	createTrackbar("LH", "2", &LH, 180, onLH);
	createTrackbar("HH", "2", &HH, 180, onHH);
	createTrackbar("LS", "2", &LS, 255, onLS);
	createTrackbar("HS", "2", &HS, 255, onHS);
	createTrackbar("LV", "2", &LV, 255, onLV);
	createTrackbar("HV", "2", &HV, 255, onHV);
	onLH(0, 0);
	onLS(0, 0);
	onLV(0, 0);
	onHH(0, 0);
	onHS(0, 0);
	onHV(0, 0);

	waitKey(0);
}

这是原图:

这是拖动滑动条调整后的二值化区域图:

OpenCV:createTrackbar()函数搭配inRange()函数精确选取想要的HSV二值化区域。_第1张图片

像图中二值化区域有些不连接,且周围有大小不一的噪点,可用先腐蚀再膨胀的方法来优化二值化图象。

总结

这2个函数的结合可帮助我们快速提取想要的色彩区域,方便使用findContours()函数去获取目标区域信息。

你可能感兴趣的:(OpenCV,opencv,计算机视觉,c++)