- 操作系统: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]