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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值