运用滑动条调节二值化区域
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(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);
}
像图中二值化区域有些不连接,且周围有大小不一的噪点,可用先腐蚀再膨胀的方法来优化二值化图象。
这2个函数的结合可帮助我们快速提取想要的色彩区域,方便使用findContours()函数去获取目标区域信息。