- 操作系统: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_size | cv::Size | cv::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;
}