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

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.dtcms.com/a/213438.html

相关文章:

  • Qt6无法识别OpenCV(Windows端开发)
  • 新一代WebP2P视频物联技术:EasyRTC嵌入式音视频通信SDK助力音视频实时通信场景应用
  • 蜂鸟E203与PicoRV32两款RISC-V处理器的对比分析
  • 紫光同创FPGA实现视频采集转USB2.0输出,基于CY7C68013芯片,提供PDS工程源码和技术支持和QT上位机
  • 05-jenkins学习之旅-vue前项目部署实践
  • hadoop异构存储
  • crc32代码设计
  • Docker基础 -- 构建 RK3588 Debian 根文件系统
  • 海思3519V200ARM Linux 下移植 Qt5.8.0
  • EPT(Efficient Prompt Tuning)方法,旨在解决提示调优(Prompt Tuning)中效率与准确性平衡和跨任务一致性的问题
  • Android studio进阶开发(六)--如何用真机通过okhttp连接服务器
  • 20250526惠普HP锐14 AMD锐龙 14英寸轻薄笔记本电脑(八核R7-7730U)的显卡驱动下载
  • Linux_编辑器Vim基本使用
  • 【iOS】 锁
  • Linux(Centos 7.6)命令详解:tar
  • jEasyUI 表单的 CRUD 应用
  • pgsql 一些用法
  • 【C++指南】string(四):编码
  • Android 架构演进之路:从 MVC 到 MVI,拥抱单向数据流的革命
  • 手机发热怎么办?
  • 网络安全全知识图谱:威胁、防护、管理与发展趋势详解
  • 【后端高阶面经:缓存篇】37、高并发系统缓存性能优化:从本地到分布式的全链路设计
  • 上海市计算机学会竞赛平台2025年5月月赛丙组手机充电
  • C语言| 拷贝传递(指针控制内存单元)
  • ROS2学习(12)------ROS2 分布式通信说明
  • 深入解析Spring Boot与Spring Security整合实现JWT认证
  • Vue 前端全方位性能优化指南
  • Java常用API
  • WireShark网络抓包—详细教程
  • uni-app学习笔记十五-vue3中defineExpose的使用