- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
該函數用于創建一個 CUDA 加速的 Canny 邊緣檢測器對象(CannyEdgeDetector),可以在 GPU 上高效執行 Canny 邊緣檢測算法。
它返回的是一個智能指針 Ptr,可以通過這個指針調用 .detect() 方法來對圖像進行邊緣檢測。
Canny 是一種經典的多階段邊緣檢測算法,包含以下幾個步驟:
- 高斯濾波去噪(用戶需自行預處理)
- 計算圖像梯度幅值和方向
- 非極大值抑制(Non-Maximum Suppression)
- 滯后閾值處理(Hysteresis Thresholding)
OpenCV 的 cv::cuda::CannyEdgeDetector 類在 GPU 上實現了上述流程,適用于需要實時性或大規模圖像處理的場景。
函數原型
Ptr<CannyEdgeDetector> cv::cuda::createCannyEdgeDetector
(double low_thresh,double high_thresh,int apperture_size = 3,bool L2gradient = false
)
參數
- low_thresh 滯后閾值處理(hysteresis procedure)中的第一個閾值(低閾值)。用于邊緣連接,低于此值的邊緣點通常會被抑制。
- high_thresh 滯后閾值處理中的第二個閾值(高閾值)。高于此值的像素被認為是強邊緣點(strong edges),會被保留。
- aperture_size Sobel 算子使用的孔徑大小(即卷積核的尺寸)。用于計算圖像梯度。常用的值為 3、5 或 7。
- L2gradient 一個標志,表示是否使用更精確的 L2 范數來計算圖像梯度幅值:
L 2 n o r m = ( d I / d x ) 2 + ( d I / d y ) 2 L_2 norm =\sqrt{(dI/dx)^2 + (dI/dy)^2} L2?norm=(dI/dx)2+(dI/dy)2?當 L2gradient = true 時使用該方式;否則使用更快但精度稍低的 L1 范數:
L 1 n o r m = ∣ d I / d x ∣ + ∣ d I / d y ∣ L_1 norm=|dI/dx|+|dI/dy| L1?norm=∣dI/dx∣+∣dI/dy∣
代碼示例
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/opencv.hpp>int main()
{// Step 1: 讀取圖像并轉換為灰度圖cv::Mat h_img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/stich1.png", cv::IMREAD_GRAYSCALE );if ( h_img.empty() ){std::cerr << "Failed to load image!" << std::endl;return -1;}// Step 2: 圖像上傳到 GPUcv::cuda::GpuMat d_img, d_edges;d_img.upload( h_img );// Step 3: 創建 Canny 邊緣檢測器(GPU 版)double low_thresh = 50;double high_thresh = 150;cv::Ptr< cv::cuda::CannyEdgeDetector > canny = cv::cuda::createCannyEdgeDetector( low_thresh, high_thresh );// Step 4: 執行邊緣檢測canny->detect( d_img, d_edges );// Step 5: 下載結果并顯示cv::Mat h_edges;d_edges.download( h_edges );cv::imshow( "Original Image", h_img );cv::imshow( "Edges", h_edges );cv::waitKey( 0 );return 0;
}
運行結果
?