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图像处理,向量下标超出范围的主要内容,如果未能解决你的问题,请参考以下文章