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

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

算法描述

比较、AND、OR、NOT等。这类操作可用于创建基于条件的掩码,这对于图像分割或特征选择非常有用。

主要函数

1. 按位与 (cv::cuda::bitwise_and)

功能: 对两个矩阵执行逐元素按位与操作。

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

2. 按位或 (cv::cuda::bitwise_or)

功能: 对两个矩阵执行逐元素按位或操作。

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

3. 按位非 (cv::cuda::bitwise_not)

功能: 对单个矩阵执行逐元素按位非操作。

函数原型
void cv::cuda::bitwise_not
(
    InputArray src,        // 输入矩阵
    OutputArray dst,       // 输出矩阵
    const GpuMat& mask = GpuMat(), // 可选掩码矩阵
    Stream& stream = Stream::Null() // 可选CUDA流
);
参数介绍
  • src: 输入的矩阵。
  • dst: 输出的结果矩阵。
  • mask: 可选的掩码矩阵,用于指定哪些像素参与计算,默认为空(不使用掩码)。
  • stream: CUDA流对象,用于控制操作的异步执行,默认为同步执行。

4. 按位异或 (cv::cuda::bitwise_xor)

功能: 对两个矩阵执行逐元素按位异或操作。

函数原型

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

示例代码

以下是一个综合示例,展示了如何使用这些逻辑运算函数,并包含了所有参数的使用:


#include <opencv2/cudaarithm.hpp>  // 包含CUDA算术和逻辑运算头文件
#include <opencv2/opencv.hpp>

int main()
{
    // 创建两个输入矩阵
    cv::Mat h_src1 = ( cv::Mat_< uchar >( 3, 3 ) << 1, 0, 1, 0, 1, 0, 1, 0, 1 );  // 第一个输入矩阵
    cv::Mat h_src2 = ( cv::Mat_< uchar >( 3, 3 ) << 0, 1, 0, 1, 0, 1, 0, 1, 0 );  // 第二个输入矩阵

    // 将它们上传到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::bitwise_and( d_src1, d_src2, d_dst );
    cv::Mat h_bitwise_and;
    d_dst.download( h_bitwise_and );
    std::cout << "Result (Bitwise AND):\n" << h_bitwise_and << std::endl;

    // 按位或操作
    cv::cuda::bitwise_or( d_src1, d_src2, d_dst );
    cv::Mat h_bitwise_or;
    d_dst.download( h_bitwise_or );
    std::cout << "Result (Bitwise OR):\n" << h_bitwise_or << std::endl;

    // 按位非操作
    cv::cuda::bitwise_not( d_src1, d_dst );
    cv::Mat h_bitwise_not;
    d_dst.download( h_bitwise_not );
    std::cout << "Result (Bitwise NOT on src1):\n" << h_bitwise_not << std::endl;

    // 按位异或操作
    cv::cuda::bitwise_xor( d_src1, d_src2, d_dst );
    cv::Mat h_bitwise_xor;
    d_dst.download( h_bitwise_xor );
    std::cout << "Result (Bitwise XOR):\n" << h_bitwise_xor << std::endl;

    return 0;
}

运行结果

Result (Bitwise AND):
[  0,   0,   0;
   0,   0,   0;
   0,   0,   0]
Result (Bitwise OR):
[  1,   1,   1;
   1,   1,   1;
   1,   1,   1]
Result (Bitwise NOT on src1):
[254, 255, 254;
 255, 254, 255;
 254, 255, 254]
Result (Bitwise XOR):
[  1,   1,   1;
   1,   1,   1;
   1,   1,   1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村北头的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值