Opencv-基础入门七

TrackBar/滚动条操作

        参数传递

        调整亮度

        调整对比度

void(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);

第一个参数,InputArray类型的src1,表示需要加权的第一个数组,一般是一个Mat;
第二个参数,double类型的alpha,表示第一个数组的权重
第三个参数,InputArray类型的src2,表示需要加权的第二个数组,它需要和第一个数组拥有相同的尺寸和通道数;
第四个参数,double类型的beta,表示第二个数组的权重;
第五个参数,double类型的gamma,加到权重总和上的标量值(类似于偏置);
第六个参数,OutputArray类型的dst,输出的数组,它和输入的两个数组有相同的尺寸和通道数;
第七个参数,int类型的dtype,输出阵列的可选深度,默认值是-1。当两个输入数组有相同的深度时,设置为-1.
下面数学公式表示:用addWeighted函数计算两个数组的加权和:

dst = src1 * alpha + src2 * beta + gamma

 

#include<quickopencv.h>
/// <summary>
/// 设置颜色空间
/// </summary>
/// <param name="image"></param>
void QuickDemo::colorSpace_Demo(Mat& image) {
	Mat gray, hsv;
	//H 0-180    S,V0-255
	cvtColor(image, hsv, COLOR_BGR2HSV);
	cvtColor(image, gray, COLOR_BGR2GRAY);
	imshow("HSV", hsv);
	imshow("灰度", gray);
	imwrite("F:/vcworkspaces/testSaveImage/hsv.png", hsv);
	imwrite("F:/vcworkspaces/testSaveImage/gray.png", gray);
}
/// <summary>
/// Mat图像对象创建与赋值
/// </summary>
void QuickDemo::mat_creation_demo() {
	//Mat m1, m2;
	//m1 = image.clone();
	//image.copyTo(m2);

	//创建空白图像
	//【1】CV_8UC1---则可以创建----8位无符号的单通道---灰度图片------grayImg
	//define CV_8UC1 CV_MAKETYPE(CV_8U,1)
	//define CV_8UC2 CV_MAKETYPE(CV_8U,2)
	//【2】CV_8UC3---则可以创建----8位无符号的三通道---RGB彩色图像---colorImg 
	//define CV_8UC3 CV_MAKETYPE(CV_8U,3)
	//【3】CV_8UC4--则可以创建-----8位无符号的四通道---带透明色的RGB图像 
	//define CV_8UC4 CV_MAKETYPE(CV_8U,4)

	//Mat m3 = Mat::zeros(Size(8, 8), CV_8UC1);
	
	//但是使用ones时的CV_8UC3只会第一个数据为1
	Mat m3 = Mat::ones(Size(512, 512), CV_8UC3);
	m3 = Scalar(255, 0, 0);//B G R
	//获取图像宽度,因此遍历像素时必须考虑通道数/
	std::cout << "width:" << m3.cols << "height:" << m3.rows << "channels:" << m3.channels() << std::endl;
	//std::cout << m3 << std::endl;
	
	//Mat m4 = m3;
	Mat m4 = m3.clone();
	m4= Scalar(0, 255, 255);//B G R
	imshow("图像3", m3);
	imshow("图像4", m4);
}
/// <summary>
/// 图像像素的读写操作
/// </summary>
/// <param name="image"></param>
void QuickDemo::pixel_visit_demo(Mat& image) {
	//宽
	int  w = image.cols;
	//高
	int h = image.rows;
	//通道数
	int dims = image.channels();
	/*
	for (int row = 0; row < h; row++)
	{
		for (int  col = 0; col < w; col++)
		{
			//灰度图像,单通道
			if (dims == 1) {
				int pv = image.at<uchar>(row, col);//(行/y/高,列/x/宽)
				image.at<uchar>(row, col) = 255 - pv;
			}
			//彩色图像,三通道
			if (dims == 3) {
				Vec3b bgr = image.at<Vec3b>(row, col);//(行/y/高,列/x/宽)
				image.at<Vec3b>(row, col)[0] = 255 - bgr[0];
				image.at<Vec3b>(row, col)[1] = 255 - bgr[1];
				image.at<Vec3b>(row, col)[2] = 255 - bgr[2];
			}
		}
	}
	*/
	//指针操作
	for (int row = 0; row < h; row++)
	{
		uchar* current_row = image.ptr<uchar>(row);
		for (int col = 0; col < w; col++)
		{
			
			//灰度图像,单通道
			if (dims == 1) {
				int pv = *current_row;//(行/y/高,列/x/宽)
				*current_row++ = 255 - pv;
			}
			//彩色图像,三通道
			if (dims == 3) {
				*current_row++ = 255 - *current_row;
				*current_row++ = 255 - *current_row;
				*current_row++ = 255 - *current_row;
			}
		}
	}
	imshow("像素读写显示", image);
}
void  QuickDemo::operators_demo(Mat& image) {
	/*Mat dst=Mat::zeros(image.size(), image.type());;
	dst = image + Scalar(150, 150, 150);
	imshow("加法操作", dst);

	dst = image - Scalar(150, 150, 150);
	imshow("减法操作", dst);*/

	/*
	Mat dst = Mat::zeros(image.size(), image.type());;
	Mat m = Mat::zeros(image.size(), image.type());
	m= Scalar(112,112, 112);*/
	//multiply(image,m,dst);
	//imshow("乘法操作", dst);

	宽
	//int  w = image.cols;
	高
	//int h = image.rows;
	通道数
	//int dims = image.channels();

	加法
	//for (int row = 0; row < h; row++)
	//{
	//	for (int col = 0; col < w; col++)
	//	{
	//		//彩色图像,三通道
	//		if (dims == 3) {
	//			Vec3b p1 = image.at<Vec3b>(row, col);//(行/y/高,列/x/宽)
	//			Vec3b p2 = m.at<Vec3b>(row, col);//(行/y/高,列/x/宽)
	//			dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(p1[0] + p2[0]);
	//			dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(p1[1] + p2[1]);
	//			dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(p1[2] + p2[2]);
	//		}
	//	}
	//}
	 
	//但是咱们会使用opencv存在的API,原因是计算运行快速
	Mat dst = Mat::zeros(image.size(), image.type());;
	Mat m = Mat::zeros(image.size(), image.type());
	m = Scalar(2, 2, 2);
	add(image, m, dst);
	imshow("加法操作", dst);
	subtract(image, m, dst);
	imshow("减法操作", dst);
	multiply(image,m,dst);
	imshow("乘法操作", dst);
	divide(image, m, dst);
	imshow("除法操作", dst);
}

//Mat src, dst, m;
//int lightness = 50;
/// <summary>
/// createTrackbar的第二个参数,必须和cvNameWindow的第一个参数完全一致。其中回调函数定义及实现如下
/// </summary>
/// <param name=""></param>
/// <param name=""></param>
static void on_lightness(int b, void* userdata) {
	Mat image = *((Mat*)userdata);
	Mat dst = Mat::zeros(image.size(), image.type());;
	Mat m = Mat::zeros(image.size(), image.type());
	m = Scalar(b, b, b);


	/*add(src, m, dst);
	imshow("亮度调整", dst);*/
	/*subtract(image, m, dst);
	imshow("亮度调整", dst);*/
	//multiply(src, m,dst);
	//imshow("亮度调整", dst);
	//divide(src, m, dst);
	//imshow("亮度调整", dst);


	addWeighted(image, 1.0, m, 0, b, dst);
	imshow("亮度及对比度调整", dst);
}
static void on_contrast(int b, void* userdata) {
	Mat image = *((Mat*)userdata);
	Mat dst = Mat::zeros(image.size(), image.type());;
	Mat m = Mat::zeros(image.size(), image.type());
	m = Scalar(b, b, b);
	double contrast = b / 100.0;

	//dst = src1*alpha + src2*beta + gamma;
	addWeighted(image, contrast, m, 0.0, 0, dst);

	imshow("亮度及对比度调整", dst);
}
void  QuickDemo::tracking_bar_demo(Mat& image) {
	namedWindow("亮度及对比度调整", WINDOW_AUTOSIZE);
	int lightness = 50;
	int max_value = 100;

	int Contrast_value = 2;
	createTrackbar("value", "亮度及对比度调整", &lightness, max_value, on_lightness,(void*)(&image));
	createTrackbar("Contrast", "亮度及对比度调整", &lightness, 200, on_contrast, (void*)(&image));
	on_lightness(50, &image);
	on_contrast(50, &image);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值