#include "highgui.h"
#include "iostream"
#include "vector"
using namespace std;
using namespace cv;
static void callbackSlide(int ,void*);
Mat img,src; //步骤1,定义后面用到的变量,要想让main函数和其他函数都能使用,必须定义全局变量;
int contrastValue=80;
int lightValue=80;
int main ()
{
img=imread("cui.jpg");//步骤二,打开一张待处理图片
if(img.empty())
cout<<"wrong"<<endl;
src=Mat::zeros(img.rows,img.cols,img.type()); //避免改变原图片,用一张新的去处理 rows是行,cols是列,type是类型
namedWindow("效果图");
createTrackbar("对比度","效果图",&contrastValue,300,callbackSlide); //z最大值必须是整数,如果是小数的话,要通过比例缩放来改变,比如想让对比度最大为3.0,最大值设为300,在后面处理时乘以0.01
createTrackbar("亮度","效果图",&lightValue,200,callbackSlide);
waitKey(0); //同时显示原图和效果图的情况下如果waitKey放到每个imshow后面会乱
}
static void callbackSlide(int,void*) //回调函数就是一种进度条当前值与实际变化效果的对应关系,输入对比度(亮度)当前值的数字,通过程序得到对比度和亮度的改变。这也是理解回调函数的核心,在上一个例子中,回调函数通过:输入视频帧数的当前值,得到的是改变后的帧的位置。
{
namedWindow("原图");
for(int i=0;i<img.rows;i++)
{
for(int j=0;j<img.cols;j++)
{
for(int x=0;x<3;x++)
{
(src.at<Vec3b>(i,j)[x])=saturate_cast<uchar>((img.at<Vec3b>(i,j)[x]*contrastValue*0.01)+lightValue); //Vec3b要包含头文件vector
}
}
}
imshow("原图",img);
imshow("效果图",src);
}