int main(){
Mat src = imread("test.jpg");
Mat src1 = src.clone();//将格式指派給src1
namedWindow("效果圖視窗", 1);
namedWindow("效果圖視窗1", 1);
Canny(src, src1, 150, 100, 3);
imshow("效果圖視窗", src1);
waitKey(30); Mat dst, edge, gray;
dst.create(src.size(), src.type());//建立與src同類型和大小的矩陣(dst)
cvtColor(src, gray, CV_BGR2GRAY);//将原圖像轉換為灰階圖像
blur(gray, edge, Size(3, 3));//先用使用 3x3核心來降噪
Canny(edge, edge, 3, 9, 3);//運作Canny算子
dst = Scalar::all(0);//将g_dstImage内的所有元素設定為0
src.copyTo(dst, edge);//使用Canny算子輸出的邊緣圖
//g_cannyDetectedEdges作為掩碼,來将原圖g_srcImage拷到目标圖g_dstImage中
imshow("效果圖視窗1", dst);//顯示效果圖
waitKey(30);
return 0;
}C++: void Canny(InputArray image,OutputArray edges, double threshold1, double threshold2, int apertureSize=3,bool L2gradient=false )
- 第二個參數,OutputArray類型的edges,輸出的邊緣圖,需要和源圖檔有一樣的尺寸和類型。
- 第三個參數,double類型的threshold1,第一個滞後性門檻值。
- 第四個參數,double類型的threshold2,第二個滞後性門檻值。
- 第五個參數,int類型的apertureSize,表示應用Sobel算子的孔徑大小,其有預設值3。
- 第六個參數,bool類型的L2gradient,一個計算圖像梯度幅值的辨別,有預設值false
- 需要注意的是,這個函數門檻值1和門檻值2兩者的小者用于邊緣連接配接,而大者用來控制強邊緣的初始段,推薦的高低門檻值比在2:1到3:1之間。