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<opencv2\opencv.hpp>
#include<opencv2/core/core.hpp>
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include<vector>

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

这是原图:

在这里插入图片描述

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

在这里插入图片描述

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

总结

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

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值