opencv bitwise_and函数c++的使用方法
时间: 2024-06-01 17:09:15 浏览: 156
Bitwise_and函数是opencv中的按位与运算函数,可以对两幅图像进行逐一比较,相同则结果图像对应点为1,不同则结果图像对应点为0。函数的使用方法为:
cv::bitwise_and(src1, src2, dst, mask)
其中,src1表示第一幅源图像,src2表示第二幅源图像,dst表示输出图像,mask表示掩码图像(可选参数)。函数所需参数均为Mat类型。
相关问题
如何使用AVX2指令集加速cv::bitwise_and带有掩码参数函数,对于一张3072x2048图像有明显加速效果
AVX2是一种指令集扩展技术,可以在特定的CPU上使用以提高运算速度。要使用AVX2指令集加速cv::bitwise_and带有掩码参数函数,可以使用OpenCV中的cv::parallel_for_函数将图像分割成多个小块,然后在每个小块中使用AVX2指令集进行位运算。
下面是一个使用AVX2指令集加速cv::bitwise_and带有掩码参数函数的示例代码:
```c++
#include <immintrin.h>
#include <opencv2/opencv.hpp>
using namespace cv;
void bitwise_and_avx2(const Mat& src1, const Mat& src2, Mat& dst, const Mat& mask)
{
CV_Assert(src1.type() == src2.type() && src1.type() == dst.type() &&
src1.size() == src2.size() && src1.size() == dst.size() &&
src1.channels() == src2.channels() && src1.channels() == dst.channels());
int channels = src1.channels();
int rows = src1.rows;
int cols = src1.cols * channels;
__m256i zero = _mm256_setzero_si256();
__m256i mask255 = _mm256_set1_epi8(255);
parallel_for_(Range(0, rows), [&](const Range& range) {
for (int i = range.start; i < range.end; i++)
{
const uchar* src1_ptr = src1.ptr<uchar>(i);
const uchar* src2_ptr = src2.ptr<uchar>(i);
const uchar* mask_ptr = mask.ptr<uchar>(i);
uchar* dst_ptr = dst.ptr<uchar>(i);
for (int j = 0; j < cols; j += 32)
{
__m256i src1_data = _mm256_loadu_si256(reinterpret_cast<const __m256i*>(src1_ptr + j));
__m256i src2_data = _mm256_loadu_si256(reinterpret_cast<const __m256i*>(src2_ptr + j));
__m256i mask_data = _mm256_loadu_si256(reinterpret_cast<const __m256i*>(mask_ptr + j));
__m256i src1_and_src2 = _mm256_and_si256(src1_data, src2_data);
__m256i dst_data = _mm256_and_si256(src1_and_src2, mask_data);
dst_data = _mm256_or_si256(dst_data, _mm256_andnot_si256(mask_data, zero));
dst_data = _mm256_min_epu8(dst_data, mask255);
_mm256_storeu_si256(reinterpret_cast<__m256i*>(dst_ptr + j), dst_data);
}
}
});
}
```
在上面的代码中,使用了AVX2指令集中的_mm256_loadu_si256、_mm256_and_si256、_mm256_or_si256、_mm256_andnot_si256、_mm256_storeu_si256等指令来加速位运算操作。此外,还使用了cv::parallel_for_函数将图像分割成多个小块,并行处理每个小块中的像素数据,以提高处理速度。
使用上面的代码可以加速cv::bitwise_and带有掩码参数函数,对于一张3072x2048的图像,可以在使用AVX2指令集的CPU上获得明显的加速效果。
bitwise_no
bitwise_not函数是OpenCV图像处理库中的一个函数,它将输入图像的每个像素的颜色取反。具体来说,该函数将输入图像中的每个像素的每个通道的像素值都取反,使得颜色从黑色变成白色,白色变成黑色。该函数的用法如下:
bitwise_not(InputArray src, OutputArray dst)
其中,src是输入图像,dst是输出图像。函数将输入图像src的每个像素的每个通道的像素值取反,并将结果存储在输出图像dst中。
在C++中,使用OpenCV的bitwise_not函数可以实现对图像进行取反操作,即将图像中的黑色和白色颜色进行交换。例如,在以下代码片段中,我们使用bitwise_not函数对图像进行取反操作并显示结果:
```cpp
#include <opencv2/opencv.hpp>
int main() {
cv::Mat image, image2;
image = cv::imread("path/to/image.jpg");
cv::bitwise_not(image, image2);
cv::imshow("result", image2);
cv::waitKey(0);
return 0;
}
```
这段代码读取了一张图像,然后使用bitwise_not函数对图像进行取反操作,并将结果显示在名为"result"的窗口中。请注意,这里的"path/to/image.jpg"应该替换为实际的图像文件路径。
另外,如果想要在阈值处理过程中进行取反操作,可以使用threshold函数的参数THRESH_BINARY_INV来实现,其效果与bitwise_not相同。具体用法请参考OpenCV的官方文档。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* [opencv中的bitwise_not,bitwise_xor,bitwise_or,bitwise_and的使用方法与效果。](https://blog.csdn.net/zhushiq1234/article/details/51113671)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
- *3* [code_hdu.rar_ACM_The First_hdu_test case example](https://download.csdn.net/download/weixin_42651281/86645822)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
阅读全文