Canny 边缘检测 | 您所在的位置:网站首页 › canny函数 › Canny 边缘检测 |
创建程序中要用到的变量: Mat src, src_gray; Mat dst, detected_edges; int edgeThresh = 1; int lowThreshold; int const max_lowThreshold = 100; int ratio = 3; int kernel_size = 3; char* window_name = "Edge Map"; 注意: a. 我们首先设定高:低阈值比为 3:1 (通过变量 *ratio* ) b. 设定内核尺寸为 :math:`3` (Canny函数内部调用Sobel操作) c. 将低阈值的上限设定为 :math:`100`.装载原图像: /// 装载图像 src = imread( argv[1] ); if( !src.data ) { return -1; }创建与 src 同类型和大小的矩阵(dst) dst.create( src.size(), src.type() );将输入图像转换到灰度空间 (使用函数 cvtColor): cvtColor( src, src_gray, CV_BGR2GRAY );创建显示窗口 namedWindow( window_name, CV_WINDOW_AUTOSIZE );创建trackbar,来获取用户交互输入的低阈值: createTrackbar( "Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold );注意: 通过trackbar控制的变量为 lowThreshold ,上限为 max_lowThreshold (我们已经设定为100) 每次用户通过trackbar产生变动,回调函数 CannyThreshold 被调用.让我们一步一步的来观察 CannyThreshold 函数: 首先, 使用 3x3的内核平滑图像: blur( src_gray, detected_edges, Size(3,3) );其次,运用 Canny 寻找边缘: Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size );输入参数: detected_edges: 原灰度图像 detected_edges: 输出图像 (支持原地计算,可为输入图像) lowThreshold: 用户通过 trackbar设定的值。 highThreshold: 设定为低阈值的3倍 (根据Canny算法的推荐) kernel_size: 设定为 3 (Sobel内核大小,内部使用)填充 dst 图像,填充值为0 (图像全黑). dst = Scalar::all(0);最后, 使用函数 copyTo 标识被检测到的边缘部分 (背景为黑色). src.copyTo( dst, detected_edges);copyTo 将 src 图像拷贝到 dst . 但是,仅仅拷贝掩码不为0的像素。既然Canny边缘检测的输出是镶嵌在黑色背景中的边缘像素,因此其结果 dst 图像除了被检测的边缘像素,其余部分都为黑色。 显示结果: imshow( window_name, dst ); |
CopyRight 2018-2019 实验室设备网 版权所有 |