Trackbar函数
CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname,int value, int count,TrackbarCallback onChange = 0,void userdata = 0); **
第一个参数:trackbar的名字
第二个参数:绑定的窗口名字
第三个参数:value一个整形的指针,表示滑块的初始位置
第四个参数:滑块的最大位置(最小位置为0)
第五个参数:回调函数(操作trackbar时会返回的函数)
第六个参数:默认为0,用户传给回调函数的数据,用来处理活动事件,value为全局变量可以不用这个参数。
借鉴:https://www.cnblogs.com/wyuzl/p/6224021.html
理解:可以把活动条处理的事件(响应),放到回调函数中,指定一个int获取value的值,根据该值处理事件,在主函数中创建这个轨迹条,每当事件发生时就会响应。
应用实例
根据BGR三通道二值化一张图片
先分成三张单通道图片
每个像素点相减得出差值,这个差值就是我们要改变的value
#include<iostream>
#include<vector>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
const int ALPHA_SLIDER_MAX = 255;
int initpos;
Mat img = imread("bigmax3.jpg");
Mat binary;
void on_trackbar(int , void*) {
//读入一张图片
Size imgsize = img.size();
vector <Mat> vRlt;
Mat bgr[3];
//cv_8uc3: 1 2 3 表示通道数 unsigned 8bits:8u表示8位的
Mat rawImg = Mat(imgsize, CV_8UC3);
Mat rImg = Mat(imgsize, CV_8UC1);
Mat gImg = Mat(imgsize, CV_8UC1);
Mat bImg = Mat(imgsize, CV_8UC1);
binary = Mat(imgsize, CV_8UC1);
split(img, bgr);
// 0 1 2 bgr
bImg = bgr[0]; //蓝色 blue
gImg = bgr[1]; //绿色 green
rImg = bgr[2]; //红色 red
for (int i = 0; i < img.rows; i++) {
//uchar * pchar1 = bImg.ptr<char>(i);
for (int j = 0; j < img.cols; j++) {
if (bImg.ptr<char>(i)[j]-rImg.ptr<char>(i)[j] < initpos) {
binary.ptr<char>(i)[j] = 0;
}
else {
binary.ptr<char>(i)[j] = 255;
}
}
}
imshow("binary", binary);
/*imshow("bimage", bImg);
imshow("rimage", rImg);
imshow("gimage", gImg);*/
}
int main() {
//创建一个名为“picture”的窗口
//namedWindow("picture");
//imshow("picture", img);
namedWindow("binary", 0);
cvResizeWindow("binary", 800, 1000);
// trackbar名字 绑定窗口名 value 最大值 回调函数
createTrackbar("阈值", "binary", &initpos, ALPHA_SLIDER_MAX, on_trackbar);
waitKey(0);
}