OpenCV CUDA模块图像处理------创建CUDA加速的Canny边缘检测器对象createCannyEdgeDetector()

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

该函数用于创建一个 CUDA 加速的 Canny 边缘检测器对象(CannyEdgeDetector),可以在 GPU 上高效执行 Canny 边缘检测算法。

它返回的是一个智能指针 Ptr,可以通过这个指针调用 .detect() 方法来对图像进行边缘检测。

Canny 是一种经典的多阶段边缘检测算法,包含以下几个步骤:

  • 高斯滤波去噪(用户需自行预处理)
  • 计算图像梯度幅值和方向
  • 非极大值抑制(Non-Maximum Suppression)
  • 滞后阈值处理(Hysteresis Thresholding)

OpenCV 的 cv::cuda::CannyEdgeDetector 类在 GPU 上实现了上述流程,适用于需要实时性或大规模图像处理的场景。

函数原型

cpp 复制代码
Ptr<CannyEdgeDetector> cv::cuda::createCannyEdgeDetector 	
(
 	double  	low_thresh,
	double  	high_thresh,
	int  	apperture_size = 3,
	bool  	L2gradient = false 
) 		

参数

  • low_thresh 滞后阈值处理(hysteresis procedure)中的第一个阈值(低阈值)。用于边缘连接,低于此值的边缘点通常会被抑制。
  • high_thresh 滞后阈值处理中的第二个阈值(高阈值)。高于此值的像素被认为是强边缘点(strong edges),会被保留。
  • aperture_size Sobel 算子使用的孔径大小(即卷积核的尺寸)。用于计算图像梯度。常用的值为 3、5 或 7。
  • L2gradient 一个标志,表示是否使用更精确的 L2 范数来计算图像梯度幅值:
    L 2 n o r m = ( d I / d x ) 2 + ( d I / d y ) 2 L_2 norm =\sqrt{(dI/dx)^2 + (dI/dy)^2} L2norm=(dI/dx)2+(dI/dy)2 当 L2gradient = true 时使用该方式;否则使用更快但精度稍低的 L1 范数:
    L 1 n o r m = ∣ d I / d x ∣ + ∣ d I / d y ∣ L_1 norm=|dI/dx|+|dI/dy| L1norm=∣dI/dx∣+∣dI/dy∣

代码示例

cpp 复制代码
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/opencv.hpp>

int main()
{
    // Step 1: 读取图像并转换为灰度图
    cv::Mat h_img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/stich1.png", cv::IMREAD_GRAYSCALE );
    if ( h_img.empty() )
    {
        std::cerr << "Failed to load image!" << std::endl;
        return -1;
    }

    // Step 2: 图像上传到 GPU
    cv::cuda::GpuMat d_img, d_edges;
    d_img.upload( h_img );

    // Step 3: 创建 Canny 边缘检测器(GPU 版)
    double low_thresh                            = 50;
    double high_thresh                           = 150;
    cv::Ptr< cv::cuda::CannyEdgeDetector > canny = cv::cuda::createCannyEdgeDetector( low_thresh, high_thresh );

    // Step 4: 执行边缘检测
    canny->detect( d_img, d_edges );

    // Step 5: 下载结果并显示
    cv::Mat h_edges;
    d_edges.download( h_edges );

    cv::imshow( "Original Image", h_img );
    cv::imshow( "Edges", h_edges );
    cv::waitKey( 0 );

    return 0;
}

运行结果

复制代码
相关推荐
大数据张老师12 分钟前
用 AI 做数据分析:从“数字”里挖“规律”
大数据·人工智能
音视频牛哥39 分钟前
如何打造毫秒级响应的RTSP播放器:架构拆解与实战优化指南
人工智能·机器人·音视频开发
张较瘦_1 小时前
[论文阅读] 人工智能 + 软件工程 | NoCode-bench:评估LLM无代码功能添加能力的新基准
论文阅读·人工智能·软件工程
go54631584651 小时前
Python点阵字生成与优化:从基础实现到高级渲染技术
开发语言·人工智能·python·深度学习·分类·数据挖掘
Coovally AI模型快速验证1 小时前
避开算力坑!无人机桥梁检测场景下YOLO模型选型指南
人工智能·深度学习·yolo·计算机视觉·目标跟踪·无人机
仰望天空—永强1 小时前
PS 2025【七月最新v26.5】PS铺软件安装|最新版|附带安装文件|详细安装说明|附PS插件
开发语言·图像处理·python·图形渲染·photoshop
水军总督1 小时前
OpenCV+Python
python·opencv·计算机视觉
巫婆理发2221 小时前
神经网络(第二课第一周)
人工智能·深度学习·神经网络
欧阳小猜2 小时前
OpenCV-图像预处理➁【图像插值方法、边缘填充策略、图像矫正、掩膜应用、水印添加,图像的噪点消除】
人工智能·opencv·计算机视觉
旭日东升的xu.2 小时前
OpenCV(04)梯度处理,边缘检测,绘制轮廓,凸包特征检测,轮廓特征查找
人工智能·opencv·计算机视觉