#include <opencv2\opencv.hpp>
using namespace std;
//定义全局图片变量
IplImage *g_SouceImage, *g_CannyImage;
//定义边缘检测窗口标题
const char *CannyTilte = "边缘检测图";
//定义函数用于接受滑块传递进来数值,调整图像边缘阀值
void on_trackbar(int n){
//Canny方法对图像进行边缘检测,参数1-输入灰度化后源图像,参数2-输出图像,参数3,参数4-阀值,参数5-表示Sobel 算子大小
/*
第三个参数和第四个参数表示阈值,
这二个阈值中当中的小阈值用来控制边缘连接,
大的阈值用来控制强边缘的初始分割即如果一个像素的梯度大与上限值,
则被认为是边缘像素,如果小于下限阈值,则被抛弃。
如果该点的梯度在两者之间则当这个点与高于上限值的像素点连接时我们才保留,否则删除。
####
第五个参数表示Sobel 算子大小,默认为3即表示一个3*3的矩阵。Sobel 算子与高斯拉普拉斯算子都是常用的边缘算子,详细的数学原理可以查阅专业书籍。
*/
cvCanny(g_SouceImage, g_CannyImage,n,n * 3,3);
cvShowImage(CannyTilte,g_CannyImage);
}
int main(){
//定义源图像
const char *SourceImage = "a.jpg";
//定义源图像窗口标题
const char *WindowTitle = "源图像窗口";
//定义滑块标题
const char *SliderTitle = "阀值设置";
//载入源图像,并灰度处理
g_SouceImage = cvLoadImage(SourceImage,CV_LOAD_IMAGE_GRAYSCALE);
//根据源图像大小创建边缘化处理图像
g_CannyImage = cvCreateImage(cvGetSize(g_SouceImage),IPL_DEPTH_8U,1);
//创建窗口
cvNamedWindow(WindowTitle,CV_WINDOW_AUTOSIZE);
cvNamedWindow(CannyTilte,CV_WINDOW_AUTOSIZE);
//设置滑块参数,和滑动事件,初始化位置为1
int SliderEdge = 1;
//滑块参数设置,参数1-滑块标题,参数2-显示在哪个窗口上,参数3-初始值,参数4-能滑动的最大值,参数5-执行事件,并把当前位置的值传递过去
cvCreateTrackbar(SliderTitle, CannyTilte, &SliderEdge, 100, on_trackbar);
//源图像,显示在WindowTitle窗口上
cvShowImage(WindowTitle,g_SouceImage);
//先执行一次调整边缘阀值
on_trackbar(1);
cvWaitKey();
//销毁窗口,释放图片
cvDestroyAllWindows();
cvReleaseImage(&g_CannyImage);
cvReleaseImage(&g_SouceImage);
return 0;
}
【opencv学习笔记】2、Canny边缘检测
最新推荐文章于 2023-05-22 10:05:08 发布