C++ OpenCV Canny边缘检测,使用Trackbar滑动条选择最佳参数

一、代码

下面代码可以通过Trackbar滑动条拖动查看最佳阈值,使用只需要修改导入图像路径。本教程提供的边缘检测方法为Canny,学者可以在此框架基础上替换为其它检测方法。

具体代码见下:

#include <iostream>               // 头文件路径
#include <opencv2/opencv.hpp>     // 图像读写
#include <opencv2/highgui.hpp>    // 图像显示
using namespace cv;               // 命名空间
using namespace std;

Mat g_src;                               // 定义g_src的矩阵变量,用于存储原始图像。
int T_value = 50;                        // 整型变量,初始化为50,该变量表示Canny边缘检测算法中的下阈值
int T_max = 255;                         // 整型变量,初始话为255,8位图像中像素的最大值

void Callcanny(int, void*) {
    
                 // 定义执行边缘检测函数
	Mat gauss, gray, edge, dst;          // 定义四个局部矩阵变量,分别用于存储高斯模糊后的图像,灰度图像,边缘图像和最终的输出图像。
	GaussianBlur(g_src, gauss, Size(3, 3), 0, 0, 4);  // 对原始图像 g_src 进行高斯模糊,结果存储在 gauss 中。这里使用了 3x3 的核,标准差为 0(由核大小自动计算),边界处理方
	// cvtColor(gauss, gray, CV_BGR2GRAY);
    cvtColor(gauss,gray,COLOR_BGR2GRAY);         // 将高斯模糊后的图像 gauss 从 BGR 颜色空间转换为灰度图像,结果存储在 gray 中。
	Canny(gray, edge, T_value / 2, T_value, 3, false);  //对灰度图像 gray 进行 Canny 边缘检测,结果存储在 edge 中。下阈值是 T_value / 2,上阈值是 T_value,Sobel 算子的孔径
	g_src.copyTo(dst, edge);        // 将原始图像 g_src 复制到 dst 中,但只有 edge 中非零像素对应的像素才会被复制。这样就将检测到的边缘叠加到了原始图像上。
	imshow("Canny", dst);           // 在名为 "Canny" 的窗口中显示处理后的图像 dst
} 

void myCannyTrackbar() {
    
                // 创建滑动条函数
	namedWindow("Canny", WINDOW_AUTOSIZE);    // 创建一个名为 "Canny" 的窗口,窗口大小会自动调整。
	createTrackbar("Threshold size", "Canny", &T_value, T_max, Callcanny);    // 在 "Canny" 窗口中创建一个名为 "阈值大小" 的滑动条,滑动条的值范围是 0 到 T_max,当滑动条的
	Callcanny(0, 0);                // 初始化时调用一次 Callcanny 函数
}

int main(int argc,char** argv) {
    
    
	// const string path = "D:/VS2015/image/Visible.bmp";//将这里换成你的图片保存的路径即可
	// const string path = "Images/Visible/CAMERA20240827113325.bmp";    // 定义了图像的路径。
	const string path = "Images/Visible/calibration_Plate.png";  // 定义了图像的路径。
	g_src = imread(path);          // 读取图像,并将结果存储在 g_src 中。
	if (!g_src.data) {
    
                 // 判断图像是否加载成功。
		cout << "could not load the image" << endl;
		return -1;
	}
	double t1 = cv::getTickCount();  // 计算程序运行时间
	myCannyTrackbar();               // 调用 myCannyTrackbar 函数创建窗口和滑动条
	double t2 = cv::getTickCount();
	double t = (t2 - t1) / cv::getTickFrequency();
	cout << "time cost " << t << endl;
	waitKey(0);       // 等待按键按下
	destroyAllWindows();   // 关闭所有窗口。
	return 0;
}

二、检测效果

原图见下:

在这里插入图片描述

运行上面代码检测效果见下:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40280673/article/details/142364537