Opencv:Trackbar(轨迹条)的创建与使用——改变阈值为例

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
#include
#include
#include

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

Opencv:Trackbar(轨迹条)的创建与使用——改变阈值为例_第1张图片

你可能感兴趣的:(Opencv,opencv)