OpenCV C++中bitwise_and运算结果异常及MATLAB find功能实现问询
嗨,我来帮你拆解这两个问题哈:
关于cv::bitwise_and结果的疑问
你这里是把按位与和逻辑与搞混啦!OpenCV的cv::bitwise_and是对每个元素的二进制位进行逐位运算,可不是判断两个数是否相等的逻辑判断哦。
咱们来掰扯一下二进制计算:
- 十进制2的8位二进制是
00000010 - 十进制3的8位二进制是
00000011
按位与的规则是:对应位都为1时结果才是1,只要有一个是0结果就是0。所以计算下来:
00000010 & 00000011 = 00000010
转换成十进制就是2,所以Mat_out里全是2完全是正确的结果~
如果你的需求是“当两个矩阵元素相等时保留值,否则为0”,那得换个写法:先通过相等判断生成掩码,再用掩码和原矩阵做按位与,示例代码如下:
cv::Mat mask; cv::compare(Mat2, Mat3, mask, cv::CMP_EQ); // 生成元素相等的掩码,相等位置为255,否则0 cv::bitwise_and(Mat2, mask, Mat_out);
这样就能得到你想要的“相等保留,否则为0”的效果了。
实现类似MATLAB中find函数的功能
MATLAB的find能返回非零元素或者满足条件元素的位置,在OpenCV里可以通过这几种方式实现:
1. 获取所有非零元素的坐标
直接用cv::findNonZero函数,它会返回一个cv::Mat,每一行对应一个非零元素的(x,y)坐标:
cv::Mat src = ...; // 你的目标矩阵 cv::Mat locations; cv::findNonZero(src, locations); // 遍历输出坐标 for (int i = 0; i < locations.rows; ++i) { cv::Point pt = locations.at<cv::Point>(i); // pt.x是列索引,pt.y是行索引 std::cout << "非零元素位置:(" << pt.x << ", " << pt.y << ")" << std::endl; }
2. 筛选满足特定条件的元素位置
比如要找矩阵中值等于5的元素,先生成对应条件的掩码,再用findNonZero提取位置:
cv::Mat src = ...; cv::Mat mask; // 生成值等于5的元素的掩码,满足条件的位置为255,否则0 cv::compare(src, 5, mask, cv::CMP_EQ); cv::Mat locations; cv::findNonZero(mask, locations); // 后续遍历处理同上面的代码
3. 生成类似MATLAB的线性索引
如果你需要像MATLAB那样的单维度线性索引(把矩阵按列优先展开后的索引),可以自己计算:
for (int i = 0; i < locations.rows; ++i) { cv::Point pt = locations.at<cv::Point>(i); // 按列优先计算线性索引,和MATLAB的索引规则一致 int linear_idx = pt.y * src.cols + pt.x; std::cout << "线性索引:" << linear_idx << std::endl; }
内容的提问来源于stack exchange,提问作者Saania
相关产品推荐
相关产品推荐

