当前位置: 首页 > article >正文

OpenCV CUDA模块图像过滤------创建一个 Sobel 滤波器函数createSobelFilter()

  • 操作系统: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 实现,适合大规模图像的高性能处理。

参数

参数名类型描述
srcTypeint输入图像的数据类型。例如:CV_8UC1, CV_32FC4 等。
dstTypeint输出图像的数据类型。通常与输入相同或转换为更高精度(如 CV_32F)。
dxintx 方向导数的阶数。取值为 0 或 1,表示是否对 x 方向求导。
dyinty 方向导数的阶数。取值为 0 或 1,表示是否对 y 方向求导。
ksizeintSobel 核大小,必须是正奇数,默认为 3。支持 1、3、5、7。
scaledouble可选比例因子,默认为 1。可用于对结果进行缩放(如归一化)。
rowBorderModeint垂直方向(行)的边界填充方式。常用值有 BORDER_DEFAULT, BORDER_REPLICATE 等。
columnBorderModeint水平方向(列)的边界填充方式,默认为 -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;
}

运行结果

在这里插入图片描述

http://www.lryc.cn/news/2386926.html

相关文章:

  • [面试精选] 0053. 最大子数组和
  • 怎么判断一个Android APP使用了Cordova这个跨端框架
  • PDF 转 JPG 图片小工具:CodeBuddy 助力解决转换痛点
  • VisionPro 与 C# 联合编程:相机连接实战指南
  • 鸿蒙OSUniApp 实现动态的 tab 切换效果#三方框架 #Uniapp
  • Docker系列(三):深度剖析Dockerfile与图形化容器实战 --- 3种容器构建方法对比与性能调优
  • 论文阅读:Next-Generation Database Interfaces:A Survey of LLM-based Text-to-SQL
  • OS面试篇
  • FFMPEG-FLV-MUX编码
  • 青少年编程与数学 02-020 C#程序设计基础 05课题、数据类型
  • React vs Vue.js:选哪个框架更适合你的项目?
  • Kafka|基础入门
  • ADS学习笔记(五) 谐波平衡仿真
  • MySQL存储引擎对比及选择指南
  • 【IDEA问题】springboot本地启动应用报错:程序包不存在;找不到符号
  • PETR- Position Embedding Transformation for Multi-View 3D Object Detection
  • Prompt Tuning与自然语言微调对比解析
  • 二十七、面向对象底层逻辑-SpringMVC九大组件之HandlerAdapter接口设计
  • QT软件开发环境及简单图形的绘制-图形学(实验一)-[成信]
  • 项目部署一次记录
  • 单例模式,饿汉式,懒汉式,在java和spring中的体现
  • 一文带你彻底理清C 语言核心知识 与 面试高频考点:从栈溢出到指针 全面解析 附带笔者手写2.4k行代码加注释
  • 【Redis】第1节|Redis服务搭建
  • 数据结构第5章 树与二叉树(竟成)
  • # 深入解析BERT自然语言处理框架:原理、结构与应用
  • ai学习--python部分-1.变量名及命名空间的存储
  • Cadence学习笔记之---PCB过孔替换、封装更新,DRC检查和状态查看
  • Java基础 Day21
  • 系统开发和运行知识
  • Elasticsearch 分片驱逐(Shard Exclusion)方式简析:`_name`、`_ip`、`_host`