- 操作系统: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() {
// 读取图像并上传到 GPU
cv::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;
}