OpenCV CUDA模块中矩阵操作------分布统计类

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

算法描述

在 OpenCV 的 CUDA 模块中,meanStdDev 函数用于计算矩阵的平均值(Mean)和标准差(StdDev)。这些函数支持同步和异步调用,并且可以接受一个可选的掩码参数来限制计算范围。

函数原型

  1. 同步版本
cpp 复制代码
 void cv::cuda::meanStdDev(InputArray src, Scalar &mean, Scalar &stddev, InputArray mask)

计算带掩码的 GPU 矩阵的平均值和标准差。

cpp 复制代码
 void cv::cuda::meanStdDev(InputArray mtx, Scalar &mean, Scalar &stddev)

计算无掩码的 GPU 矩阵的平均值和标准差。

  1. 异步版本
cpp 复制代码
void cv::cuda::meanStdDev(InputArray src, OutputArray dst, InputArray mask, Stream &stream=Stream::Null())

异步计算带掩码的 GPU 矩阵的平均值和标准差,结果存储在 OutputArray 中。

cpp 复制代码
  void cv::cuda::meanStdDev(InputArray mtx, OutputArray dst, Stream &stream=Stream::Null())

异步计算无掩码的 GPU 矩阵的平均值和标准差,结果存储在 OutputArray 中。

参数

  • InputArray src/mtx: 输入的 GPU 矩阵。
  • Scalar &mean/stddev: 输出的平均值和标准差。
  • InputArray mask: 可选的掩码矩阵,指定哪些元素参与计算,默认为整个矩阵。
  • OutputArray dst: 输出的结果矩阵,通常是一个包含两个 cv::Scalar 值的 GpuMat。
  • Stream &stream: 可选的 CUDA 流对象,用于异步执行,默认使用主线程流。

示例代码

下面是一个完整的 C++ 示例代码,演示了如何使用上述四个函数:

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

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);

    // 创建一个掩码矩阵(仅允许右下角区域参与计算)
    cv::Mat h_mask = cv::Mat::zeros(h_mat.size(), CV_8UC1);
    cv::rectangle(h_mask, cv::Rect(2, 2, 1, 1), cv::Scalar(255), cv::FILLED); // 右下角像素

    // 上传到 GPU
    cv::cuda::GpuMat d_mat, d_mask;
    d_mat.upload(h_mat);
    d_mask.upload(h_mask);

    // 存储异步结果的 GpuMat
    cv::cuda::GpuMat d_result;

    // 创建 CUDA 流
    cv::cuda::Stream stream;

    // 同步版本 ------------------------------------------------------------------------------------------------

    // 1. 带掩码的 mean 和 stddev
    cv::Scalar mean, stddev;
    cv::cuda::meanStdDev(d_mat, mean, stddev, d_mask);
    std::cout << "Sync Mean with mask: " << mean << std::endl;
    std::cout << "Sync StdDev with mask: " << stddev << std::endl;

    // 2. 不带掩码的 mean 和 stddev
    cv::cuda::meanStdDev(d_mat, mean, stddev);
    std::cout << "Sync Mean without mask: " << mean << std::endl;
    std::cout << "Sync StdDev without mask: " << stddev << std::endl;

    // 异步版本 ------------------------------------------------------------------------------------------------

    // 3. 异步:带掩码的 mean 和 stddev
    cv::cuda::meanStdDev(d_mat, d_result, d_mask, stream);
    stream.waitForCompletion();

    cv::Mat host_result;
    d_result.download(host_result);
    cv::Scalar async_mean = host_result.at<double>(0, 0);
    cv::Scalar async_stddev = host_result.at<double>(1, 0);
    std::cout << "Async Mean with mask: " << async_mean << std::endl;
    std::cout << "Async StdDev with mask: " << async_stddev << std::endl;

    // 4. 异步:不带掩码的 mean 和 stddev
    cv::cuda::meanStdDev(d_mat, d_result, stream);
    stream.waitForCompletion();

    d_result.download(host_result);
    async_mean = host_result.at<double>(0, 0);
    async_stddev = host_result.at<double>(1, 0);
    std::cout << "Async Mean without mask: " << async_mean << std::endl;
    std::cout << "Async StdDev without mask: " << async_stddev << std::endl;

    return 0;
}

运行结果

bash 复制代码
Sync Mean with mask: [9, 0, 0, 0]
Sync StdDev with mask: [0, 0, 0, 0]
Sync Mean without mask: [5, 0, 0, 0]
Sync StdDev without mask: [2.58199, 0, 0, 0]
Async Mean with mask: [9, 0, 0, 0]
Async StdDev with mask: [0, 0, 0, 0]
Async Mean without mask: [5, 0, 0, 0]
Async StdDev without mask: [0, 0, 0, 0]
相关推荐
Easy数模3 分钟前
Word2Vec模型训练全流程解析:从数据预处理到实体识别应用
人工智能·机器学习·自然语言处理·word2vec
weixin_422456446 分钟前
第N8周:使用Word2vec实现文本分类
人工智能·自然语言处理·word2vec
lm down25 分钟前
ComfyUI中运行Wan 2.1工作流,电影级视频,兼容Mac, Windows
人工智能·macos·ai作画·视频
nlp研究牲41 分钟前
latex中既控制列内容位置又控制列宽,使用>{\centering\arraybackslash}p{0.85cm}
服务器·前端·人工智能·算法·latex
莫彩1 小时前
【大模型论文阅读】2503.01821_On the Power of Context-Enhanced Learning in LLMs
论文阅读·人工智能·语言模型
hhhh明1 小时前
【调试Bug】网络在训练中输出NaN
人工智能·算法
里昆2 小时前
【AI】Jupyterlab中数据集的位置和程序和Pycharm中的区别
人工智能·学习
WSSWWWSSW2 小时前
基于模拟的流程为灵巧机器人定制训练数据
人工智能·chatgpt·机器人
大视码垛机2 小时前
协作机器人掀起工厂革命:码垛场景如何用数据重塑制造业命脉?
大数据·数据库·人工智能
呆头鹅AI工作室2 小时前
[2025CVPR-图象分类方向]SPARC:用于视觉语言模型中零样本多标签识别的分数提示和自适应融合
图像处理·人工智能·python·深度学习·神经网络·计算机视觉·语言模型