OpenCV学习笔记(四)
一、Canny边缘检测
函数原型
void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize = 3, bool L2gradient = false)
- 第一个参数,InputArray类型的image,输入图像,Mat类型的对象,且为单通道8位图像
- 第二个参数,OutputArray类型的edges,输出的边缘图,需要和源图片一样的尺寸和类型
- 第三个参数,double类型的threshold1,第一个滞后性阈值
- 第四个参数,double类型的threshold2,第二个滞后阈值
- 第五个参数,int类型的apertureSize,表示应用Soble算子的孔径大小,默认值3
- 第六个参数,bool类型的L2gradient,一个计算图像梯度幅值的标识,默认false
注意:阈值1好阈值2两者中较小的值用于边缘连接,而较大的值用来控制强边缘的初始段,推荐的高低阈值比在2:1到3:1之间。
调用实例:
Mat src = imread("1.jpg");
Canny(src,src,3,9,3);
imshow("[效果图]",src)
示例程序
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
Mat src = imread("1.jpg");
Mat src1 = src.clone();
imshow("[原始图]", src);
Mat dst, edge, gray;
dst.create(src1.size(), src1.type());
//灰度化
cvtColor(src1, gray, COLOR_BGR2GRAY);
//3*3内核降噪
blur(gray, edge, Size(3,3));
Canny(gray, edge, 3, 9, 3);
dst = Scalar::all(0);
//Canny算子输出的边缘图g_cannyDetectedEdges作为掩码,将原图g_srcImage拷贝到g_dstImage
src1.copyTo(dst, edge);
imshow("[效果图]", dst);
waitKey(0);
return 0;
}