OpenCV中利用滑动条实时地观察不同阈值下的Canny算法效果

Canny算法:

void Canny(Input image, Output image of edges, Double threshold1, Double threshold2, int aperture_size=3 )

·第一个参数:输入的图像,读取图像的命令:Mat frame = imread("4.jpg",0); //imread中的第二个参数为0表示将图像读取灰度图像,可减少计算机的计算量,如果第二个参数为1,那么读取为彩色图像(本身是灰度图仍为灰度图);

·第二个参数:输出的边缘检测图,可直接利用imshow命令显示图像:imshow("显示窗口的名字", edge);

·第三个参数和第四个参数:threshold1和threshold2是检测边缘的两个参数,本文也就是利用滑动条改变它们的值来实时显示Canny算法的效果。两个阈值中大的值用于初始判断边缘,小的值用于对边缘进行修补;

第五个参数:sobel算子的孔径大小;一个近似求导的检测边缘的算子,一般取3。

下面这段程序是本文标题所述的实现方法:

#include <opencv2/opencv.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#define WindowName "Test"	//定义窗口名字的宏
using namespace cv;			//使用命名空间,那么在程序中使用cv的语法时就不需要加前缀"cv::"

char Trackbarname1[50];		//用于存储滑动条1的名称
char Trackbarname2[50];		//用于存储滑动条2的名称
int pre_place1,pre_place2;	//滑动条对应的变量,两个阈值变量
const int max_place = 255;	//定义Trackbar的最大值
Mat frame,src,dst;			//定义Mat类型的frame变量,用于存储图像

int main(){
	namedWindow(WindowName,WINDOW_AUTOSIZE);    //定义自动适应图片大小的窗口
	pre_place1 = 20;							//滑动条的初始位置
	pre_place2 = 150;                           //滑动条的初始位置
	frame = imread("污渍块.jpg",0);             //读取名为1的jpg格式图片
	blur(frame,frame, Size(3,3) );              //降噪,减少噪声引起的假边缘
	sprintf(Trackbarname1,"阈值1 %d",max_place);//sprintf函数,格式化赋值
    sprintf(Trackbarname2,"阈值2 %d",max_place);//sprintf函数,格式化赋值
	createTrackbar(Trackbarname1,WindowName,&pre_place1,max_place); //创建滑动条
	createTrackbar(Trackbarname2,WindowName,&pre_place2,max_place); //创建滑动条
	while(1){
		pre_place1 = getTrackbarPos(Trackbarname1, WindowName);	//获取滑动条当前位置
		pre_place2 = getTrackbarPos(Trackbarname2, WindowName);	//获取滑动条当前位置
		Canny(frame,dst,pre_place1,pre_place2,3);
		imshow(WindowName,dst);
		if(waitKey(10)==27) break;     //按下Esc键退出程序
	}
	return 0;
}

原图1:


效果:


原图2:


效果:


这段代码可以为用户快速地确定阈值的合理值。


Guess you like

Origin blog.csdn.net/qq_34917728/article/details/79470606