2016-11-25 3 views
-1

Я пытаюсь применить фильтр по изображению, вывод окна фильтра (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();       

    } 
} 
+0

Вы пытаетесь его отладить? Попробуйте, особенно в цикле, где вы получите ошибку времени выполнения, и вы скоро обнаружите, где проблема. – Gonmator

+1

* Не знаю, где я делаю ошибку * - Поскольку вы используете Visual Studio, должно быть ясно, где происходит ошибка. Поскольку отладчик открывает диалоговое окно и просит вас «Разбить», что принимает вы туда, где происходит ошибка. – PaulMcKenzie

+0

Исправьте интервал и форматирование. – rlandster

ответ

0

Допустим, вы имеете все отрицательные значения в window[], кроме одного, который хранится в последнем индексе. Теперь вы нажмете только один элемент в nonzero_elements, и, следовательно, его размер равен 1. Но вы получаете 8-й элемент nonzero_element и, следовательно, вне диапазона.

Смежные вопросы