You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:26:26