当前位置: 首页 > news >正文

OpenCV CUDA模块中逐元素操作------算术运算

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

算法描述

算术运算:包括加法、减法、乘法和除法等基本运算。这些操作可以应用于两个相同尺寸的矩阵,或者一个矩阵与一个标量之间。例如,将两个图像矩阵相加可以用于图像合成。

主要函数

1. 加法操作 (cv::cuda::add)

功能: 对两个矩阵或一个矩阵和一个标量执行逐元素加法操作。

函数原型
void cv::cuda::add
(InputArray src1,        // 第一个输入矩阵或标量InputArray src2,        // 第二个输入矩阵或标量OutputArray dst,       // 输出矩阵const GpuMat& mask = GpuMat(), // 可选掩码矩阵int dtype = -1,        // 输出矩阵的数据类型(默认与输入相同)Stream& stream = Stream::Null() // 可选CUDA流
);
参数介绍
  • src1: 输入的第一个矩阵或标量。
  • src2: 输入的第二个矩阵或标量。
  • dst: 输出的结果矩阵。
  • mask: 可选的掩码矩阵,用于指定哪些像素参与计算,默认为空(不使用掩码)。
  • dtype: 输出矩阵的数据类型,如果设置为-1,则与输入矩阵相同。
  • stream: CUDA流对象,用于控制操作的异步执行,默认为同步执行。

2. 减法操作 (cv::cuda::subtract)

功能: 对两个矩阵或一个矩阵和一个标量执行逐元素减法操作。

函数原型
void cv::cuda::subtract
(InputArray src1,InputArray src2,OutputArray dst,const GpuMat& mask = GpuMat(),int dtype = -1,Stream& stream = Stream::Null()
);
参数介绍
  • src1: 输入的第一个矩阵或标量。
  • src2: 输入的第二个矩阵或标量。
  • dst: 输出的结果矩阵。
  • mask: 可选的掩码矩阵,用于指定哪些像素参与计算,默认为空(不使用掩码)。
  • dtype: 输出矩阵的数据类型,如果设置为-1,则与输入矩阵相同。
  • stream: CUDA流对象,用于控制操作的异步执行,默认为同步执行。

3. 乘法操作 (cv::cuda::multiply)

功能: 对两个矩阵或一个矩阵和一个标量执行逐元素乘法操作。

函数原型
void cv::cuda::multiply
(InputArray src1,InputArray src2,OutputArray dst,double scale = 1,      // 缩放因子,默认为1int dtype = -1,        // 输出矩阵的数据类型(默认与输入相同)Stream& stream = Stream::Null()
);

参数

  • src1: 输入的第一个矩阵或标量。
  • src2: 输入的第二个矩阵或标量。
  • dst: 输出的结果矩阵。
  • scale: 缩放因子,结果将乘以这个值,默认为1。
  • dtype: 输出矩阵的数据类型,如果设置为-1,则与输入矩阵相同。
  • stream: CUDA流对象,用于控制操作的异步执行,默认为同步执行。

4. 除法操作 (cv::cuda::divide)

功能: 对两个矩阵或一个矩阵和一个标量执行逐元素除法操作。

函数原型
void cv::cuda::divide
(InputArray src1,InputArray src2,OutputArray dst,double scale = 1,      // 缩放因子,默认为1int dtype = -1,        // 输出矩阵的数据类型(默认与输入相同)Stream& stream = Stream::Null()
);
参数
  • src1: 输入的第一个矩阵或标量。
  • src2: 输入的第二个矩阵或标量。
  • dst: 输出的结果矩阵。
  • scale: 缩放因子,结果将乘以这个值,默认为1。
  • dtype: 输出矩阵的数据类型,如果设置为-1,则与输入矩阵相同。
  • stream: CUDA流对象,用于控制操作的异步执行,默认为同步执行。

5. 绝对值 (cv::cuda::abs)

功能: 计算每个元素的绝对值,支持实数和复数类型。

函数原型
void cv::cuda::abs
(InputArray src,        // 输入矩阵OutputArray dst,       // 输出矩阵Stream& stream = Stream::Null()
);
参数
  • src: 输入的矩阵。
  • dst: 输出的结果矩阵。
  • stream: CUDA流对象,用于控制操作的异步执行,默认为同步执行。

6. 绝对差值 (cv::cuda::absdiff)

功能: 计算两个数组对应元素差值的绝对值。

函数原型
void cv::cuda::absdiff
(InputArray src1,InputArray src2,OutputArray dst,Stream& stream = Stream::Null()
);
参数
  • src1: 输入的第一个矩阵。
  • src2: 输入的第二个矩阵。
  • dst: 输出的结果矩阵。
  • stream: CUDA流对象,用于控制操作的异步执行,默认为同步执行。

代码示例

#include <opencv2/cudaarithm.hpp>  // 包含CUDA算术运算头文件
#include <opencv2/opencv.hpp>int main()
{// 创建两个输入矩阵cv::Mat h_src1 = ( cv::Mat_< float >( 3, 3 ) << 1, 2, 3, 4, 5, 6, 7, 8, 9 );  // 第一个输入矩阵cv::Mat h_src2 = ( cv::Mat_< float >( 3, 3 ) << 9, 8, 7, 6, 5, 4, 3, 2, 1 );  // 第二个输入矩阵// 将它们上传到GPUcv::cuda::GpuMat d_src1, d_src2;d_src1.upload( h_src1 );d_src2.upload( h_src2 );// 定义输出矩阵cv::cuda::GpuMat d_dst;// 加法操作cv::cuda::add( d_src1, d_src2, d_dst );cv::Mat h_add;d_dst.download( h_add );std::cout << "Result (Addition):\n" << h_add << std::endl;// 减法操作cv::cuda::subtract( d_src1, d_src2, d_dst );cv::Mat h_subtract;d_dst.download( h_subtract );std::cout << "Result (Subtraction):\n" << h_subtract << std::endl;// 乘法操作cv::cuda::multiply( d_src1, d_src2, d_dst, 1.0, CV_32F );cv::Mat h_multiply;d_dst.download( h_multiply );std::cout << "Result (Multiplication):\n" << h_multiply << std::endl;// 除法操作cv::cuda::divide( d_src1, d_src2, d_dst, 1.0, CV_32F );cv::Mat h_divide;d_dst.download( h_divide );std::cout << "Result (Division):\n" << h_divide << std::endl;// 绝对差值cv::cuda::absdiff( d_src1, d_src2, d_dst );cv::Mat h_absdiff;d_dst.download( h_absdiff );std::cout << "Result (AbsDiff):\n" << h_absdiff << std::endl;return 0;
}

运行结果

Result (Addition):
[10, 10, 10;10, 10, 10;10, 10, 10]
Result (Subtraction):
[-8, -6, -4;-2, 0, 2;4, 6, 8]
Result (Multiplication):
[9, 16, 21;24, 25, 24;21, 16, 9]
Result (Division):
[0.11111111, 0.25, 0.42857143;0.66666669, 1, 1.5;2.3333333, 4, 9]
Result (AbsDiff):
[8, 6, 4;2, 0, 2;4, 6, 8]
http://www.xdnf.cn/news/439795.html

相关文章:

  • 滑动窗口算法笔记
  • 【CSS】使用 CSS 绘制三角形
  • 阿里巴巴java开发手册
  • 【C/C++】深度探索c++对象模型_笔记
  • 一分钟在Cherry Studio和VSCode集成火山引擎veimagex-mcp
  • 【Rust trait特质】如何在Rust中使用trait特质,全面解析与应用实战
  • Data Mining|缺省值补全实验
  • Three.js知识框架
  • Java 大视界 -- 基于 Java 的大数据分布式存储在工业互联网海量设备数据长期存储中的应用优化(248)
  • Linux架构篇、第五章_02git2.49.0分支管理与Gitee的部署
  • 车用CAN接口芯片:汽车神经系统的沉默构建者
  • 国产大模型 “五强争霸”,决战 AGI
  • 枢轴支压点策略
  • Flutter到HarmonyOS Next 的跨越:memory_info库的鸿蒙适配之旅
  • 可视化数据图表怎么做?如何实现三维数据可视化?
  • R语言机器学习算法实战系列(二十五)随机森林算法多标签分组分类器及模型可解释性
  • 小结:Android系统架构
  • 2025-5-14渗透测试:利用Printer Bug ,NTLMv2 Hash Relay(中继攻击),CVE-2019-1040漏洞复现
  • SparkSQL-数据提取和保存
  • 基于网关实现不同网段S7-1200 CPU的通信方法
  • vue2+ThinkPHP5实现简单大文件切片上传
  • 集成 ONLYOFFICE 与 AI 插件,为您的服务带来智能文档编辑器
  • 化工单元操作试验装置系列产品JG-SX211计算机过程控制板框过滤操作实训装置
  • 【vim】--- vim 插件说明 超详细持续更新中
  • Kafka进阶指南:从原理到实战
  • kafka connect 大概了解
  • 新能源汽车三电质量护盾:蓝光三维扫描技术显身手
  • 力扣每日一题之移动零
  • HTTP 连接复用机制详解
  • egpo进行train_egpo训练时,keyvalueError:“replay_sequence_length“