OpenCV—边缘检测(Canny算子,Sobel算子,Laplace算子,Scharr滤波)

有点偷懒,凑合着看吧
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

//添加头文件
#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();
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

啊

发布了97 篇原创文章 · 获赞 221 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_32642107/article/details/104589109