【问题标题】:Weird OpenCV Code奇怪的 OpenCV 代码
【发布时间】:2014-02-21 09:37:16
【问题描述】:

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

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;

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

【问题讨论】:

    标签: image opencv pixels iplimage


    【解决方案1】:

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

    【讨论】:

    • 是的,这就是我想要做的——修改数据。嗯,我尝试对单独的输出图像执行此操作(克隆图像并将其分配给不同的 IplImage),但输出仍然相同
    • 好的,我终于明白你在说什么了。现在代码可以工作了!谢谢!
    • IplImage 结果克隆到标头克隆(您需要cvCreateImagecvCopy 才能正确执行此操作)。 cv::Mat::clone() 要容易得多。
    【解决方案2】:

    您的代码溢出。

    如果你想检查一个 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;
    

    【讨论】:

    • 嗯谢谢你的信息!但这并没有改变什么
    猜你喜欢
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 2014-06-01
    相关资源
    最近更新 更多