奇怪的OpenCV代码

时间:2014-01-29 14:10:30

标签: image opencv pixels iplimage

这很奇怪。我有以下代码:

int white = 0;
int black = 0;   
for (int i = 0; i < height; i++) {
    for (int j = 0; j < width; j++) {
        int total = 0;
        for (int x = i - 1; x <= i + 1; x++) {
            for (int y = j - 1; y <= j + 1; y++) {
                total += data[x*step + y];
            }
        }
        if (total == (255 * 9)) {
            white += 1;
            // data[i*step + j] = 255;
        }
        else {
            black += 1;
            // data[i*step + j] = 0;
        }
    }
}
cout << white << endl << black << endl;

当我运行此代码时,它将正确输入白色和黑色。但由于某种原因,当我取消注释数据时,代码将是错误的。顺便说一句,我只是简单地侵蚀了一个图像,这就是我到目前为止所做的。

2 个答案:

答案 0 :(得分:4)

当您取消注释这些语句时,您将在其中修改data[]“并且,因为您正在执行邻域操作,所以修改后的数据将在后续迭代中重新用作输入数据,这将是当然会使结果无效。您需要一个单独的输出图像来将这些新值写入。

答案 1 :(得分:3)

你的代码溢出了。

如果你想检查一个3x3的邻居,你需要在所有方面留出1个像素的边框。

另外,你不能就地,你需要第二个Mat来获得结果。

Mat m2 = m.clone();

int white = 0;
int black = 0;   
for (int i = 1; i < height - 1; i++){        // border
    for (int j = 1; j < width - 1; j++){     // border
        int total = 0;
        for (int x = i - 1; x <= i + 1; x++){
            for (int y = j - 1; y <= j + 1; y++){
                total += data[x*step + y];
            }
        }
        if (total == (255 * 9)){
            white += 1;
            m2.data[i*step + j] = 255;      // *write* to a 2nd mat
        }
        else{
            black += 1;
            m2.data[i*step + j] = 0;        // *write* to a 2nd mat
        }   
    }
}
cout << white << endl << black << endl;