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

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

算法描述

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

主要函数

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

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

函数原型
cpp 复制代码
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)

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

函数原型
cpp 复制代码
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)

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

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

参数

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

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

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

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

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

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

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

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

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

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

代码示例

cpp 复制代码
#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 );  // 第二个输入矩阵

    // 将它们上传到GPU
    cv::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;
}

运行结果

cpp 复制代码
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]
相关推荐
whoarethenext2 分钟前
使用 C/C++的OpenCV 实时播放火柴人爱心舞蹈动画
c语言·c++·opencv
carpell19 分钟前
【语义分割专栏】3:Segnet实战篇(附上完整可运行的代码pytorch)
人工智能·python·深度学习·计算机视觉·语义分割
智能汽车人32 分钟前
自动驾驶---SD图导航的规划策略
人工智能·机器学习·自动驾驶
mengyoufengyu41 分钟前
DeepSeek11-Ollama + Open WebUI 搭建本地 RAG 知识库全流程指南
人工智能·深度学习·deepseek
Tianyanxiao43 分钟前
华为×小鹏战略合作:破局智能驾驶深水区的商业逻辑深度解析
大数据·人工智能·经验分享·华为·金融·数据分析
whoarethenext1 小时前
C++ OpenCV 学习路线图
c++·opencv·学习
rit84324991 小时前
基于BP神经网络的语音特征信号分类
人工智能·神经网络·分类
一点.点1 小时前
AlphaDrive:通过强化学习和推理释放自动驾驶中 VLM 的力量
人工智能·机器学习·自动驾驶
科技小E1 小时前
口罩佩戴检测算法AI智能分析网关V4工厂/工业等多场景守护公共卫生安全
网络·人工智能
说私域1 小时前
基于定制开发开源AI智能名片S2B2C商城小程序的首屏组件优化策略研究
人工智能·小程序·开源·零售