- 操作系統:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
cv::cuda::reduce 函數用于對 GPU 上的矩陣沿某個維度進行降維操作,例如求和、取最大值等。此函數支持多種降維操作,并允許指定輸出數據類型以及使用 CUDA 流進行異步處理。
函數原型
void cv::cuda::reduce
(InputArray mtx, // 輸入矩陣OutputArray vec, // 輸出向量int dim, // 降維維度:0表示按列,1表示按行int reduceOp, // 降維操作類型(如SUM, AVG, MAX, MIN)int dtype = -1, // 輸出數組的數據類型,默認為輸入相同類型Stream &stream = Stream::Null() // 可選 CUDA 流
);
參數
-
mtx: 輸入 GPU 矩陣。
-
vec: 輸出 GPU 向量。
-
dim: 指定沿哪個維度進行降維:
- 0: 按列降維(結果為行向量)。
- 1: 按行降維(結果為列向量)。
-
reduceOp: 降維操作類型:
- REDUCE_SUM: 求和。
- REDUCE_AVG: 平均值。
- REDUCE_MAX: 最大值。
- REDUCE_MIN: 最小值。
-
dtype: 輸出數組的數據類型。默認為與輸入相同類型。
-
stream: 可選 CUDA 流對象,用于異步執行。
代碼示例
#include <iostream>
#include <opencv2/cudaarithm.hpp>
#include <opencv2/opencv.hpp>int main()
{// 創建一個測試矩陣cv::Mat h_mat = ( cv::Mat_< float >( 3, 3 ) << 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f );// 上傳到 GPUcv::cuda::GpuMat d_mat;d_mat.upload( h_mat );// 存儲降維結果的 GpuMatcv::cuda::GpuMat d_vec;// 創建 CUDA 流cv::cuda::Stream stream;// 沿列方向(dim=0)進行 SUM 操作cv::cuda::reduce( d_mat, d_vec, 0, cv::REDUCE_SUM, -1, stream );stream.waitForCompletion();// 下載結果并顯示cv::Mat host_vec_sum_col;d_vec.download( host_vec_sum_col );std::cout << "Sum along columns: \n" << host_vec_sum_col << std::endl;// 沿行方向(dim=1)進行 AVG 操作cv::cuda::reduce( d_mat, d_vec, 1, cv::REDUCE_AVG, -1, stream );stream.waitForCompletion();// 下載結果并顯示cv::Mat host_vec_avg_row;d_vec.download( host_vec_avg_row );std::cout << "Average along rows: \n" << host_vec_avg_row << std::endl;return 0;
}
運行結果
Sum along columns:
[12, 15, 18]
Average along rows:
[2;5;8]