Canny算法是进行边缘检测的一种实用的算法,具体实现方法如下。在本程序中设置了滑动条可以改变高低阈值。
#include <opencv2/opencv.hpp> #include <opencv/highgui.h> using namespace cv; using namespace std; //Canny边缘检测 //实现用滑动条改变高、低阈值 const int sliderHigh_max = 20;//设置高阈值的最大值 const int sliderLow_max = 10;//设置低阈值的最大值 int sliderHigh; int sliderLow; Mat pic, grayPic, edge; void trackbar(int, void*) { Canny(edge, edge, sliderLow, sliderHigh, 3); imshow("Canny边缘提取", edge); } int main() { pic = imread("..\\picture\\lena.jpg"); imshow("原始图像",pic); cvtColor(pic, grayPic, COLOR_BGR2GRAY);//将原始图像转化为灰度图 blur(grayPic, edge, Size(3, 3));//使用blur进行滤波 sliderHigh = 0; sliderLow = 0; namedWindow("Canny边缘提取", 1); createTrackbar("CannyLow", "Canny边缘提取", &sliderLow, sliderLow_max, trackbar);//设置低阈值 createTrackbar("CannyHigh", "Canny边缘提取", &sliderHigh, sliderHigh_max, trackbar);//设置高阈值 trackbar(sliderLow, 0); trackbar(sliderHigh, 0); waitKey(0); }
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,表示应用Sobel算子的孔径大小,其有默认值3。
- bool类型的L2gradient,一个计算图像梯度幅值的标识,有默认值false。