c ++:"找到cv :: mat"的非零元素不按预期工作

时间:2015-04-10 15:47:39

标签: c++ matlab opencv find mat

我实现了一个函数,它为您提供了cv :: mat格式矩阵的所有非零元素的索引。我想确定这个二进制图像的白色区域:http://i.stack.imgur.com/mVJ7N.png。  我希望得到与Matlab的“查找”功能相同的结果。我的代码如下(我希望专家不会心脏病发作):

#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\ml\ml.hpp>
#include <cstring>
#include <iostream>
#include <vector>

using namespace cv;
void findIndex(Mat imgmat, std::vector <std::vector <int> > &indices);

int main(void)
{
String img;
Mat imgmat;
img = "Mask120.png";
imgmat = imread(img);
std::vector <std::vector <int> > indices;
findIndex(imgmat, indices);
return 0;
}


void findIndex(Mat mask, std::vector< std::vector<int> >& indices){
int x_ind[100000]; // ugly, I know
int y_ind[100000];
int k = 0;

for (int i = 0; i < mask.rows; i++) {
    for (int j = 0; j < mask.cols; j++) {
        if (mask.at<uchar>(i, j) == 255) {
            x_ind[k] = j;
            y_ind[k] = i;
            k = k + 1;
        }
    }
}
indices.resize(2, std::vector<int>(k));

for (int m = 0; m < k; m++) {
    indices[0][m] = x_ind[m];
    indices[1][m] = y_ind[m];
}
}

它给出了两个向量,但结果与Matlab的“查找”不同,显然不正确。使用find,总共有大约22000个非零元素,此方法识别大约57000.此外,标记为非零的第一个索引是i = 119和j = 561,对应于该点(562/120) )我的二进制图像,这不是一个白点。

对于我犯错误的任何想法都非常感谢!

1 个答案:

答案 0 :(得分:0)

我可以为您的问题提供一个简单的解决方案

其中输入cv :: Mat是maskMat(它应该是CV_8UC1) 输出将在位置向量中更新为x和y坐标的点

Mat whiteMat = maskMat == 255;
vector<Point> locations;
int count = countNonZero(binaryMat);
if(count < 0)
{
    findNonZero(binaryMat,locations);
}

opencv的某些更高版本高于3.0

Mat whiteMat = maskMat == 255;
vector<Point> locations;
findNonZero(binaryMat,locations);