opencv图像处理,向量下标超出范围

Posted

技术标签:

【中文标题】opencv图像处理,向量下标超出范围【英文标题】:opencv image processing, vector subscript out of range 【发布时间】:2016-11-25 06:51:57 【问题描述】:

我正在尝试对图像应用过滤器,过滤器窗口 (3x3) 的输出存储在向量中(仅非零值丢弃零值)。我想添加向量的前四个值并将答案存储在输出图像中。运行程序会生成错误“向量下标超出范围”。不知道我在哪里做错了。

Mat Diff;//input image
int window[9];
Mat road;//output image

road = Diff.clone();
for (int y = 0; y < Diff.rows; y++)
for (int x = 0; x < Diff.cols; x++)
    road.at<uchar>(y, x) = 0;
//Apply road filter

for (int y = 1; y < Diff.rows - 1; y++)
    for (int x = 1; x < Diff.cols - 1; x++)

        // Pick up window element

        window[0] = abs(Diff.at<uchar>(y - 1, x - 1) - Diff.at<uchar>(y, x));
        window[1] = abs(Diff.at<uchar>(y, x - 1) - Diff.at<uchar>(y, x));
        window[2] = abs(Diff.at<uchar>(y + 1, x - 1) - Diff.at<uchar>(y, x));
        window[3] = abs(Diff.at<uchar>(y - 1, x) - Diff.at<uchar>(y, x));
        window[4] = abs(Diff.at<uchar>(y, x) - Diff.at<uchar>(y, x));
        window[5] = abs(Diff.at<uchar>(y + 1, x) - Diff.at<uchar>(y, x));
        window[6] = abs(Diff.at<uchar>(y - 1, x + 1) - Diff.at<uchar>(y, x));
        window[7] = abs(Diff.at<uchar>(y, x + 1) - Diff.at<uchar>(y, x));
        window[8] = abs(Diff.at<uchar>(y + 1, x + 1) - Diff.at<uchar>(y, x));

        int road_detector = 0;
        vector<int>nonzero_elements;
        for (int n = 0; n < 9;n++)
            if (window[n]>0)

                nonzero_elements.push_back(window[n]);
                // select the first non-zero four values of window and sum them
                //road.at<uchar>(y, x) = window[0]+window[1]+window[2]+window[3];
                if (nonzero_elements.size() <4)

                    road_detector += nonzero_elements[n];

                
                else
                    // sort the window  
                    sort(nonzero_elements.begin(), nonzero_elements.end());
                    road_detector = nonzero_elements.at(0) + nonzero_elements.at(1) + nonzero_elements.at(2) + nonzero_elements.at(3);
                
            

        road.at<uchar>(y, x) = road_detector;
        nonzero_elements.clear();                           

    

【问题讨论】:

您是否尝试过调试它?尝试一下,尤其是在你得到运行时错误的循环中,你很快就会发现问题出在哪里。 不知道哪里出错了 -- 既然你用的是Visual Studio,应该很清楚错误发生在哪里。因为调试器弹出一个对话框并要求您“中断”,这会将您带到发生错误的位置。 修正一些间距和格式。 【参考方案1】:

假设您在window[] 中拥有所有负值,除了一个存储在最后一个索引处的值。现在您将只推送nonzero_elements 中的一个元素,因此它的大小为1。但是您正在访问nonzero_element 的第8 个元素,因此超出了范围。

【讨论】:

以上是关于opencv图像处理,向量下标超出范围的主要内容,如果未能解决你的问题,请参考以下文章

向量下标超出范围错误 - C++ Vectors & Open CV

(opencv) 调试断言失败,向量下标超出范围

向量下标超出范围opencv c++

矢量下标超出范围错误消息 3

向量下标超出函数范围

二维向量下标超出范围