OpenCV CUDA模块中的矩阵算术运算------创建卷积操作对象的工厂方法 cv::cuda::createConvolution

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

算法描述

createConvolution函数是OpenCV CUDA 模块中用于创建卷积操作对象的工厂方法。它返回一个指向 cv::cuda::Convolution 接口的智能指针(cv::Ptr),该接口可以执行高效的 GPU 卷积操作。

函数原型

cv::Ptr<cv::cuda::Convolution> cv::cuda::createConvolution
(
	cv::Size user_block_size = cv::Size()
)

参数说明

参数名类型默认值说明
user_block_sizecv::Sizecv::Size()(即自动选择)可选参数,指定在 GPU 上执行卷积时使用的线程块大小(block size)。如果不设置,则由 OpenCV 自动选择最优值。

功能说明

该函数会根据当前设备环境和性能优化策略,动态选择并实例化一个具体的卷积实现类(如基于 FFT 或直接卷积算法),然后返回其接口指针。

你可以通过这个指针调用 convolve(…) 方法进行卷积运算:

cv::Ptr<cv::cuda::Convolution> conv = cv::cuda::createConvolution();
conv->convolve(src, kernel, dst);

代码示例

include <iostream>
#include <opencv2/cudaarithm.hpp>
#include <opencv2/opencv.hpp>

int main()
{
    // 读取图像并上传到 GPU
    cv::Mat h_img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/Lenna.png", cv::IMREAD_GRAYSCALE );
    if ( h_img.empty() )
    {
        std::cerr << "Image load failed!" << std::endl;
        return -1;
    }

    // 将图像转换为单通道 32 位浮点数格式
    cv::Mat h_img_float;
    h_img.convertTo( h_img_float, CV_32F );

    cv::cuda::GpuMat d_img;
    d_img.upload( h_img_float );  // 上传转换后的图像

    // 定义卷积核(例如 Sobel x 方向)
    cv::Mat kernel = ( cv::Mat_< float >( 3, 3 ) << -1, 0, 1, -2, 0, 2, -1, 0, 1 );

    cv::cuda::GpuMat d_kernel;
    d_kernel.upload( kernel );

    // 创建卷积对象(使用默认 block size)
    cv::Ptr< cv::cuda::Convolution > conv = cv::cuda::createConvolution();

    // 输出矩阵
    cv::cuda::GpuMat d_result;

    // 执行卷积操作(false 表示卷积;true 表示互相关)
    conv->convolve( d_img, d_kernel, d_result, false );

    // 下载结果
    cv::Mat h_result;
    d_result.download( h_result );

    // 归一化显示
    cv::Mat h_result_normalized;
    h_result.convertTo( h_result_normalized, CV_8U, 255.0 / h_result.rows );  // 简单归一化以适应显示范围
    cv::imshow( "GPU Convolution Result", h_result_normalized );
    cv::waitKey( 0 );

    return 0;
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村北头的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值