addWeighted函数利用公式 dst = src1 * alpha + src2 * beta + gamma; 来计算两个数组(图像)的加权和,换句话说就是两个图像按照一定比例融合,然后生成新的图像。
06_opencv_mat.h
#pragma once #ifndef _06_OPENCV_MAT_H #define _06_OPENCV_MAT_H #includeusing namespace cv; struct contrast_parm { double alpha; double beta; double gamma; }; class QuickDemo { public: //滚动条 void tracking_bar_demo(Mat& image); }; #endif
06_opencv_mat.cpp
#include#include "06_opencv_mat.h" using namespace std; static void on_track(int pos, void* userdata) { struct contrast_parm cp; cp.alpha = pos / 50.0; // 0 -- 2 cp.beta = 0.0; cp.gamma = 0.0; Mat src = *((Mat*)userdata); Mat dst = Mat::zeros(src.size(), src.type()); Mat temp = Mat::zeros(src.size(), src.type()); temp = Scalar(pos, pos, pos); addWeighted(src, cp.alpha,temp, cp.beta, cp.gamma,dst); imshow("对比度调整", dst); } void QuickDemo::tracking_bar_demo(Mat &image) { namedWindow("对比度调整", WINDOW_AUTOSIZE); //我希望滚动条的调整范围在 0 - 100 之间 //不用设置最小值,默认就是0 - 100 int contrast_value = 0; //初始值设置为0 int max_value = 100; //参数1 - 给这个滚动条设置一个名字 //参数2 - 滚动条显示在哪个窗体 //参数3 - 通过哪个值来控制,需要传地址过去 //参数4 - 调整的范围是多少,即最大值是多少,最小值为0 //参数5 - 是一个回调函数, TrackbarCallback onChange = 0,默认为NULL(0), // typedef void (*TrackbarCallback)(int pos, void* userdata); // 当我们滑动滚动条时,就会产生一个事件(Trackbar Change),系统会捕捉这个事件, // 然后调用我们写的回调函数TrackbarCallback //参数6 - void* userdata = 0,是否需要它携带一个外带的数据,这个数据可以是你自己定义的,由void*修饰 createTrackbar("Value Bar:", "对比度调整", &contrast_value, max_value, on_track,(void*)(&image)); on_track(contrast_value,&image); }
main.c
#include#include "06_opencv_mat.h" using namespace std; int main(int argc,char** argv) { //使用Mat(matrix -- 矩阵)这种类型来读取通过指定路径的图像信息并存放到变量picture中。 //图像从本质上来说都是二维的数组(矩阵) Mat picture = imread("雪地.jpeg", IMREAD_COLOR); if (picture.empty()) { cout << "could not Load image." << endl; system("pause"); return -1; } // namedWindow("输入窗口",WINDOW_FREERATIO); imshow("输入窗口", picture); QuickDemo qd; qd.tracking_bar_demo(picture); waitKey(0); destroyAllWindows(); system("pause"); return 0; }
运行程序:
注意:这里我只控制一个参数alpha,其他两个参数我都让它为0了。
初始时,
滑动到中间
100%



