2015-01-20 3 views
0

, поэтому я стараюсь понять, почему я получаю эту ошибку утверждения из opencv при доступе к указателю в следующем столбце/строке изображения. Позвольте мне рассказать вам, что происходит и предоставить какой-то код.Ошибка утверждения при доступе к указателю на пиксели openCV

  • Я беру ROI от образа, который является cv::Mat или заголовок секции большой cv::Mat.
  • Я построил несколько указателей, чтобы получить доступ к значению моей ROI. Так что давайте говорить мой ROI заполняется значениями пикселей и 3х3 Mat

    with the following Dimensions (index starting at 0,0) 
        --------- 
        | 1 | 2 | 3 | 
        | 4 | 5 | 6 | 
        | 7 | 8 | 9 | 
    
  • первую очередь мне нужно инициализировать свои указатели, чтобы указать на их позиции соответственно. Я взял ptr функцию cv::Mat и их местоположение в сетке через cv::Point.

Проблема столкнулась:

Когда я пытаюсь получить доступ к пикселю следующего соседа, я получаю ошибку утверждения.

Диагностика на меня:

  • Я думал, что это может быть диапазон, но я убедился, что не было бы в случае, определив для условий цикла в соответствии с моими размерами.
  • Элемент, который я пытаюсь получить, не существует, но как я его понимаю, когда я просматриваю ROI, у меня уже есть значения в новой матрице, и я должен иметь доступ ко всем значениям вокруг моих желаемых пикселей.

часть кода:

 cv::Mat ROI =disTrafo(cv::Rect(cv::Point(x,y),cv::Size(3,3))); 
     cv::minMaxLoc(ROI,&minVal,&maxVal,&minCoord,&maxCoord); 
     auto* maxPtr_x = &maxCoord.x; 
     auto* maxPtr_y = &maxCoord.y; 
     auto* maxPtr_value = &maxVal; 
     uchar diff1 = 0; 
     uchar diff2= 0; 
     uchar diff3 = 0; 
     uchar diff4 = 0; 
     uchar max_diff = 0; 








     for(int j = 1; j < ROI.rows ; j++){ 

      auto current = ROI.ptr<uchar>(maxCoord.y); 
      auto neighbor_down = ROI.ptr<uchar>(maxCoord.y+1); //THE PROB IS HERE according to debugging 
      auto neighbor_up = ROI.ptr<uchar>(maxCoord.y-1); 

      cv::Point poi ; //point of interest 


      for(int i= 0; i < ROI.cols; i++){ 


       switch(maxCoord.x){ //PROOF FOR LOGIC 
        case 0: 
         if(maxCoord.y == 0){ //another switch statement maybe ?? 

          diff1 = std::abs(current[maxCoord.x+1] - current[maxCoord.x]); 
          diff2 = std::abs(neighbor_down[maxCoord.x] - current[maxCoord.x]); 

          if(diff2 > diff1){ 

           cv::Point(maxCoord.x,maxCoord.y+1) = poi; 

          } else { 

           cv::Point(maxCoord.x+1,maxCoord.y) = poi; 

          } 

         }; 

Assertion Failed при выполнении его: OpenCV Error: Утверждение не удалось (у == 0 || < данных & & тускнеет> = 1 & & (unsigned) y < (без знака) size.p [0])) в cv :: Mat :: ptr, file // ... указывает путь к заголовочному файлу mat.hpp // строка 428

Я не могу пощупать проблему, не могли бы вы помочь. И, пожалуйста, дайте мне некоторые знания при работе с указателями и пикселями в случае, если я что-то неправильно понял.

Спасибо

+0

Просьба указать, какое подтверждение не удалось (сообщение об ошибке) – Micka

+0

УКАЗАНИЕ при запуске: ошибка OpenCV: утверждение не выполнено (y == 0 || = 1 && (unsigned) y <(без знака) размер .p [0])) в cv :: Mat :: ptr, file // ... указывает путь к макету заголовка.hpp // строка 428 и VS выбрасывает ее как cv :: Exception – Engin007

+0

вы можете: 'std :: cout << maxCoord.y << std :: endl' before' auto current = ROI.ptr (maxCoord.y); 'и сообщить последнее значение? – Micka

ответ

0

попробовать это

for(int j = 1; j < ROI.rows ; j++){ 

     auto current = ROI.ptr<uchar>(maxCoord.y); 
     auto neighbor_down = ROI.ptr<uchar>(maxCoord.y+1); //THE PROB IS HERE according to debugging 
     auto neighbor_up = ROI.ptr<uchar>(maxCoord.y-1); 

     cv::Point poi ; //point of interest 

     cv::Point bordess(Point(0,0)); 
     for(int i= 0; i < ROI.cols; i++){ 


      switch(maxCoord.x){ //PROOF FOR LOGIC 
       case 0: 
        if(maxCoord.y == 0){ //another switch statement maybe ?? 

         diff1 = std::abs(current[maxCoord.x+1] - current[maxCoord.x]); 
         diff2 = std::abs(neighbor_down[maxCoord.x] - current[maxCoord.x]); 

         if(diff2 > diff1){ 

          cv::Point(maxCoord.x,maxCoord.y+1) = poi & bordess; 

         } else { 

          cv::Point(maxCoord.x+1,maxCoord.y) = poi & bordess; 

         } 

        }; 
+0

моя проблема в том, что он сработает, прежде чем достигнуть вашей точки борделя. Так что это не очень актуально в моем случае. – Engin007

0

Ok так что в основном я понял, что мое определение указателя было неправильно в связи с характером входного изображения. Я сделал некоторую предварительную обработку с изображением, а диапазоны значений внутри изменились с uchar на другое значение. Когда я сменил auto neighbor_down = ROI.ptr<uchar>(maxCoord.y+1);, например, до auto neighbor_down = ROI.ptr<float>(maxCoord.y+1); все было нормально.