Я пытаюсь применить фильтр по изображению, вывод окна фильтра (3x3) сохраняется в векторе (только ненулевые значения отбрасывают нулевые значения). Я хочу добавить первые четыре значения вектора и сохранить ответ на выходном изображении. Запуск программы генерирует ошибку «Векторный индекс вне диапазона». Не знаю, где я делаю ошибку.обработка изображения opencv, векторный индекс вне диапазона
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();
}
}
Вы пытаетесь его отладить? Попробуйте, особенно в цикле, где вы получите ошибку времени выполнения, и вы скоро обнаружите, где проблема. – Gonmator
* Не знаю, где я делаю ошибку * - Поскольку вы используете Visual Studio, должно быть ясно, где происходит ошибка. Поскольку отладчик открывает диалоговое окно и просит вас «Разбить», что принимает вы туда, где происходит ошибка. – PaulMcKenzie
Исправьте интервал и форматирование. – rlandster