- 操作系統: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 ); // 第二個輸入矩陣// 將它們上傳到GPUcv::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]