- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
cv::cuda::createDerivFilter 是 OpenCV CUDA 模塊中的一個工廠函數,用于創建一個計算圖像導數的濾波器。這個濾波器可以用來計算圖像在 x 方向和 y 方向上的任意階導數。它特別適用于邊緣檢測、特征提取等計算機視覺任務。
函數原型
cv::Ptr<cv::cuda::Filter> cv::cuda::createDerivFilter
(int srcType,int dstType,int dx,int dy,int ksize,bool normalize = false,double scale = 1,int rowBorderMode = cv::BORDER_DEFAULT,int columnBorderMode = -1
);
參數
參數名 | 類型 | 描述 |
---|---|---|
srcType | int | 輸入圖像類型,例如 CV_8UC1, CV_32FC1 等。 |
dstType | int | 輸出圖像類型,通常與輸入類型相同或根據需求指定。 |
dx | int | x方向上的導數階數(0表示不計算x方向導數)。 |
dy | int | y方向上的導數階數(0表示不計算y方向導數)。 |
ksize | int | 使用的Sobel核大小(必須是奇數且大于1),例如3, 5, 7等。 |
normalize | bool | 是否對結果進行歸一化處理,默認為 false。 |
scale | double | 計算導數值時的縮放因子,默認為 1。 |
rowBorderMode | int | 行方向上的邊界填充模式,默認為 cv::BORDER_DEFAULT。 |
columnBorderMode | int | 列方向上的邊界填充模式,默認使用 rowBorderMode 的值(即 -1)。 |
代碼示例
include <opencv2/cudafilters.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/opencv.hpp>int main()
{// 讀取灰度圖像cv::Mat h_img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_GRAYSCALE );if ( h_img.empty() ){std::cerr << "Error: Image not found!" << std::endl;return -1;}// 上傳到 GPUcv::cuda::GpuMat d_src, d_dst_x, d_dst_y;d_src.upload(h_img);// 創建x方向導數濾波器(ksize=3)cv::Ptr<cv::cuda::Filter> derivXFilter = cv::cuda::createDerivFilter(d_src.type(), // 輸入類型(CV_8UC1)CV_32FC1, // 輸出類型(浮點數類型更合適)1, // dx = 1 表示計算x方向一階導數0, // dy = 0 不計算y方向導數3 // Sobel核大小);// 應用x方向導數濾波器derivXFilter->apply(d_src, d_dst_x);// 創建y方向導數濾波器(ksize=3)cv::Ptr<cv::cuda::Filter> derivYFilter = cv::cuda::createDerivFilter(d_src.type(), // 輸入類型(CV_8UC1)CV_32FC1, // 輸出類型(浮點數類型更合適)0, // dx = 0 不計算x方向導數1, // dy = 1 表示計算y方向一階導數3 // Sobel核大小);// 應用y方向導數濾波器derivYFilter->apply(d_src, d_dst_y);// 下載結果回 CPUcv::Mat h_dst_x_f, h_dst_y_f; // 浮點數結果d_dst_x.download(h_dst_x_f);d_dst_y.download(h_dst_y_f);// 歸一化處理以便顯示cv::Mat h_dst_x_8u, h_dst_y_8u; // 用于顯示的8位無符號整數結果cv::normalize(h_dst_x_f, h_dst_x_8u, 0, 255, cv::NORM_MINMAX, CV_8U);cv::normalize(h_dst_y_f, h_dst_y_8u, 0, 255, cv::NORM_MINMAX, CV_8U);// 顯示原始圖像及導數圖像cv::imshow("Original", h_img);cv::imshow("X Direction Derivative", h_dst_x_8u);cv::imshow("Y Direction Derivative", h_dst_y_8u);cv::waitKey(0);return 0;
}