有点偷懒,凑合着看吧
//添加头文件
#include<opencv2/core/core.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;
//参数预定义
int Way_num=0;
int struct_size=1;
Mat Img_in , Img_out,Img_gray;
Mat Img_out_x , Img_out_y;
//函数声明
void callback_Way_num(int ,void*);
void callback_struct_size(int ,void*);
void process();
//主函数
int main ()
{
Img_in=imread("home.jpg");
cvtColor(Img_in,Img_gray,CV_BGR2GRAY);
imshow("【原图】",Img_gray);
//添加跟踪条
namedWindow("【效果图】");
createTrackbar("Canny/Sobel/Laplace/scharr","【效果图】",&Way_num, 3 , callback_Way_num);
callback_Way_num(Way_num,0);
//添加跟踪条
createTrackbar("参数值","【效果图】",&struct_size, 45 , callback_struct_size);
callback_struct_size(struct_size,0);
waitKey(0);
return 0;
}
//进行自定义的各功能操作
void process()
{
//Way_num=0,Canny算子
if (Way_num==0)
Canny(Img_gray,Img_out,struct_size , struct_size*5 , 3);
//Way_num=1,Sobel算子
else if(Way_num==1)
{
//计算x方向梯度
Sobel(Img_in , Img_out_x,CV_16U, 1 , 0 , struct_size*2+1 , 1 , 1 , BORDER_DEFAULT);
convertScaleAbs(Img_out_x,Img_out_x);
//计算y方向的梯度
Sobel(Img_in , Img_out_y,CV_16U, 0 , 1 , struct_size*2+1 , 1 , 1 , BORDER_DEFAULT);
convertScaleAbs(Img_out_y,Img_out_y);
//合并
addWeighted( Img_out_x,0.5, Img_out_y , 0.5,0, Img_out);
}
//Way_num=2,Laplace算子
else if(Way_num==2)
{
Laplacian(Img_gray,Img_out, CV_16U , struct_size*2+1, 1 , 0 , BORDER_DEFAULT);
convertScaleAbs(Img_out ,Img_out);
}
//Way_num=3,scharr滤波
else if(Way_num==3)
{
//计算x方向梯度
Scharr(Img_in , Img_out_x,CV_16U, 1 , 0 , 1 , 0 , BORDER_DEFAULT);
convertScaleAbs(Img_out_x,Img_out_x);
//计算y方向的梯度
Scharr(Img_in , Img_out_y,CV_16U, 0 , 1 , 1 , 0 , BORDER_DEFAULT);
convertScaleAbs(Img_out_y,Img_out_y);
//合并
addWeighted( Img_out_x , 0.5 , Img_out_y , 0.5 , 0 , Img_out);
}
//显示
imshow("【效果图】",Img_out);
}
//更能切换开关的回调函数
void callback_Way_num(int ,void*)
{
process();
}
//改变各个功能操作内核时的回调函数
void callback_struct_size(int ,void*)
{
process();
}