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