- 操作系統: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()
{// 讀取圖像并上傳到 GPUcv::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;
}