OpenCV CUDA模块中矩阵操作------归一化与变换操作

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

算法描述

在 OpenCV 的 CUDA 模块中,normalize 和 rectStdDev 函数用于对矩阵进行归一化处理和基于积分图计算矩形区域的标准差。

函数介绍

1. 归一化处理normalize

函数原型
cpp 复制代码
void cv::cuda::normalize
(
    InputArray src,           // 输入数组
    OutputArray dst,          // 输出数组
    double alpha = 1.0,       // 范围的下限或正则化因子
    double beta = 0.0,        // 范围的上限
    int norm_type = NORM_L2,  // 归一化的类型
    int dtype = -1,           // 输出数组的数据类型(-1 表示与输入相同)
    InputArray mask = noArray(), // 可选掩码
    Stream &stream = Stream::Null() // 可选 CUDA 流
);
参数说明
  • src: 输入 GPU 矩阵。
  • dst: 输出 GPU 矩阵。
  • alpha: 如果 norm_type 是 NORM_MINMAX,则为范围的下限;否则是正则化因子。
  • beta: 如果 norm_type 是 NORM_MINMAX,则为范围的上限。
  • norm_type: 归一化类型,如 NORM_MINMAX, NORM_L1, NORM_L2 等。
  • dtype: 输出数组的数据类型,默认为与输入相同。
  • mask: 可选掩码矩阵,指定哪些元素参与归一化。
  • stream: 可选 CUDA 流对象,用于异步执行。

2. 基于积分图计算矩形区域的标准差rectStdDev

函数原型
cpp 复制代码
void cv::cuda::rectStdDev
(
    InputArray src,   // 输入数组
    InputArray sqr,   // 输入平方数组
    OutputArray dst,  // 输出数组
    Rect rect,        // 计算标准差的矩形区域
    Stream &stream = Stream::Null() // 可选 CUDA 流
);
参数说明
  • src: 输入 GPU 矩阵。
  • sqr: 输入 GPU 矩阵的平方值。
  • dst: 输出 GPU 矩阵。
  • rect: 定义计算标准差的矩形区域。
  • stream: 可选 CUDA 流对象,用于异步执行。

代码示例

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

int main()
{
    // 创建一个测试矩阵(float 类型)
    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 );

    // 转换为 rectStdDev 支持的类型:CV_32SC1
    cv::Mat h_int;
    h_mat.convertTo( h_int, CV_32SC1 );  // float -> int

    // 上传到 GPU
    cv::cuda::GpuMat d_src;
    d_src.upload( h_int );

    // 存储归一化结果的 GpuMat
    cv::cuda::GpuMat d_normalized;

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

    // 归一化处理 ------------------------------------------------------------------------------------------------

    // 使用 NORM_MINMAX 归一化
    cv::cuda::normalize( d_src, d_normalized, 0.0, 1.0, cv::NORM_MINMAX, -1, cv::noArray(), stream );
    stream.waitForCompletion();

    // 下载结果
    cv::Mat host_normalized;
    d_normalized.download( host_normalized );
    std::cout << "Normalized Matrix: \n" << host_normalized << std::endl;

    // 计算矩形区域的标准差 ------------------------------------------------------------------------------

    // 手动计算平方值(注意必须为 CV_64FC1)
    cv::Mat h_sqr;
    h_int.convertTo( h_sqr, CV_64FC1 );  // 先转为 double
    h_sqr = h_sqr.mul( h_sqr );          // 平方操作

    // 上传平方图像
    cv::cuda::GpuMat d_sqr;
    d_sqr.upload( h_sqr );

    // 定义矩形区域(例如中心 2x2 区域)
    cv::Rect rect( 1, 1, 2, 2 );

    // 存储标准差结果的 GpuMat
    cv::cuda::GpuMat d_stddev;

    // 计算标准差
    cv::cuda::rectStdDev( d_src, d_sqr, d_stddev, rect, stream );
    stream.waitForCompletion();

    // 下载结果
    cv::Mat host_stddev;
    d_stddev.download( host_stddev );
    std::cout << "Standard Deviation in Rect: " << host_stddev.at< double >( 0, 0 ) << std::endl;

    return 0;
}

运行结果

bash 复制代码
Normalized Matrix: 
[0, 0, 0;
 0, 0, 1;
 1, 1, 1]
Standard Deviation in Rect: 11.1384
相关推荐
葡萄城技术团队几秒前
表格智能体系列 · 2:AI 怎么“看到“你的表格
人工智能
一航jason几秒前
AIOS 岗位技能技术栈与开源工程全景
人工智能·ai·ai编程·ai-native
SZ_WSKY1 分钟前
拆解微型滑台的“生命周期”:非标自动化产线背后的精度损耗与维护真相
人工智能·科技·机器人·自动化·制造
王志来137944730087 分钟前
多元场景催生工控服务器机箱差异化需求匀天以柔性适配回应行业挑战
运维·服务器·人工智能·python
狂师8 分钟前
UI自动化测试提效必备Skill!一套CI流水线编排 Skill 可以直接抄了...
人工智能·agent·测试
光锥智能12 分钟前
争抢“实时互动”,爱诗科技的世界模型走到哪了
人工智能·科技·实时互动
天空之城--15 分钟前
Android Flutter行业最新动态与实用参考(2026年8月第3周)
android·人工智能·flutter·ai编程
码视野1 小时前
基于 Vue3 + Element Plus 的【微短剧剧本智能创作与分镜生产协同系统】设计与实现(含PRD/三端源码/大屏)
前端·人工智能·vue3
axiao91 小时前
2026年呼和浩特集团品牌全域传播服务商推荐:GEO优化+短视频+网站+广告全链路机构
大数据·人工智能
朴实赋能1 小时前
妇儿医院 AI 助手怎么落地?CareWork 本地化智能体的多 Agent 协同与合规边界设计
大数据·人工智能·腾讯云ai代码助手·ai 智能体·医疗多 agent 协同·妇儿医院 ai 助手·本地化部署 ai