#include<iostream>
#include<opencv2/opencv.hpp>
#define window1 "【结果1】"
#define window "【原图 】"
#define window2 "【结果2】"
#define window3 "【结果3】"
#define window4 "【结果4】"
#define window5 "【结果5】"
using namespace std;
using namespace cv;
Mat src,dst1,dst2;
//2.
int g1_thresh = 110;
int g1_mod = 0;
int g1_threshmethod = THRESH_BINARY;
int g2_modofthresh = 0;
int g2_modofmethod = 1;
int g2_gaossin_or_mean = ADAPTIVE_THRESH_GAUSSIAN_C;
int g2_neibor = 2;
int g2_threshmethod = THRESH_BINARY;
//4 回调函数
void on_thresh(int,void*);
void on_autothresh(int,void*);
//两个窗口
//窗口1:threshold函数。
//滑动条1 来控制阈值大小,从0-255,初始值取中间值。
//滑动条2 来控制阈值模式,0 binary,1,binary_inv,2.trunc.3.zero 4.zero_inv
//窗口2:adeptivethreshold函数。
//滑动条1:模式:1,binary,2.binary—inv
//滑动条2:方法:1.高斯模式,几何平均值模式。
//滑动条3:邻域尺寸。奇数。
int main()
{
//1.读取原图。
src;
src = imread("游乐园.jpg",0);
resize(src,src,Size(),0.8,0.8);
imshow(window,src);
//2.创建集中阈值控制模式的判别变量。全局变量。
//3.创建两个窗口。
namedWindow(window1,WINDOW_AUTOSIZE);
namedWindow(window2,WINDOW_AUTOSIZE);
imshow(window1,src);
imshow(window2,src);
//4.回调函数以及滑动条。
createTrackbar("阈值",window1,&g1_thresh,255,on_thresh);
createTrackbar("模式",window1,&g1_mod,3,on_thresh);
createTrackbar("模式",window2,&g2_modofthresh,1,on_autothresh);
createTrackbar("均值方法",window2,&g2_modofmethod,1,on_autothresh);
createTrackbar("邻域大小",window2,&g2_neibor,10,on_autothresh);
while (1)
{
int c=waitKey(1);
if (c == 27)
{
return 0;
break;
}
if (c == 'q')
{
return 0;
break;
}
}
waitKey(0);
return 0;
}
void on_thresh(int, void*)
{
//1.根据各个控制条件来判断参数
switch (g1_mod)
{
case 0:
g1_threshmethod = THRESH_BINARY;
break;
case 1:
g1_threshmethod = THRESH_BINARY_INV;
break;
case 2:
g1_threshmethod = THRESH_TRUNC;
break;
case 3:
g1_threshmethod = THRESH_TOZERO;
break;
case 4:
g1_threshmethod = THRESH_TOZERO_INV;
break;
}
//2.然后进行阈值取值。
threshold(src,dst1,g1_thresh,255,g1_threshmethod);
imshow(window1,dst1);
}
void on_autothresh(int, void*)
{
//1.根据各控制滑动条来确定参数。
if (g2_modofthresh == 0) //0为binary,1为ivy
g2_threshmethod = THRESH_BINARY;
else
g2_threshmethod = THRESH_BINARY_INV;
if (g2_modofmethod == 1)//0为普通均值,1位高斯均值。
g2_gaossin_or_mean = ADAPTIVE_THRESH_GAUSSIAN_C;
else
g2_gaossin_or_mean = ADAPTIVE_THRESH_MEAN_C;
int g2_box = 2 * g2_neibor + 1;
//2.开始调用函数。
if (g2_box >= 3)
adaptiveThreshold(src, dst2, 255, g2_gaossin_or_mean, g2_threshmethod, g2_box, 5);
else
return;
imshow(window2,dst2);
}