- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
該函數用于創建一個 Sobel 濾波器,用于在 GPU 上進行邊緣檢測。它基于圖像的梯度計算:
- dx 表示對 x 方向求導的階數(0 或 1)
- dy 表示對 y 方向求導的階數(0 或 1)
- 支持核大小為 1、3、5、7 等奇數尺寸(默認為 3)
由于是 CUDA 實現,適合大規模圖像的高性能處理。
參數
參數名 | 類型 | 描述 |
---|---|---|
srcType | int | 輸入圖像的數據類型。例如:CV_8UC1 , CV_32FC4 等。 |
dstType | int | 輸出圖像的數據類型。通常與輸入相同或轉換為更高精度(如 CV_32F )。 |
dx | int | x 方向導數的階數。取值為 0 或 1,表示是否對 x 方向求導。 |
dy | int | y 方向導數的階數。取值為 0 或 1,表示是否對 y 方向求導。 |
ksize | int | Sobel 核大小,必須是正奇數,默認為 3。支持 1、3、5、7。 |
scale | double | 可選比例因子,默認為 1。可用于對結果進行縮放(如歸一化)。 |
rowBorderMode | int | 垂直方向(行)的邊界填充方式。常用值有 BORDER_DEFAULT , BORDER_REPLICATE 等。 |
columnBorderMode | int | 水平方向(列)的邊界填充方式,默認為 -1,表示與 rowBorderMode 相同。 |
返回值
返回一個指向 cv::cuda::Filter 的智能指針 (Ptr),可以調用 .apply() 方法在 GPU 上執行 Sobel 邊緣檢測操作。
代碼示例
以下是一個完整的使用 createSobelFilter 提取圖像 x 和 y 方向梯度的示例代碼:
#include <opencv2/opencv.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudafilters.hpp>int main() {// 讀取圖像并上傳到 GPUcv::Mat h_input = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_GRAYSCALE);if (h_input.empty()) {std::cerr << "無法加載圖像!" << std::endl;return -1;}cv::cuda::GpuMat d_input, d_output_x, d_output_y;d_input.upload(h_input);// 創建 Sobel 濾波器(x方向)cv::Ptr<cv::cuda::Filter> sobelX = cv::cuda::createSobelFilter(d_input.type(), // 輸入類型CV_32F, // 輸出設為浮點型1, // x方向導數0, // y方向不導數3 // 核大小);// 創建 Sobel 濾波器(y方向)cv::Ptr<cv::cuda::Filter> sobelY = cv::cuda::createSobelFilter(d_input.type(),CV_32F,0,1,3);// 應用濾波器sobelX->apply(d_input, d_output_x);sobelY->apply(d_input, d_output_y);// 下載結果并歸一化顯示cv::Mat h_output_x, h_output_y;d_output_x.download(h_output_x);d_output_y.download(h_output_y);cv::Mat out_x_u8, out_y_u8;cv::normalize(h_output_x, out_x_u8, 0, 255, cv::NORM_MINMAX, CV_8U);cv::normalize(h_output_y, out_y_u8, 0, 255, cv::NORM_MINMAX, CV_8U);cv::imshow("Sobel X", out_x_u8);cv::imshow("Sobel Y", out_y_u8);cv::waitKey(0);return 0;
}