目录
- 一、代码
- 二、检测效果
一、代码
下面代码可以通过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;
}
二、检测效果
原图见下:
运行上面代码检测效果见下: