Почему я получаю ошибку сегмента, когда пытаюсь ввести значение в OpenCV?

c++ opencv

74 просмотра

2 ответа

Итак, у меня есть этот кусок кода:

  if(channels == 3)
    type = CV_32FC3;
  else
    type = CV_32FC1;
  cv::Mat M(rows,cols,type);
  std::cout<<"Cols:"<<cols<<" ColsMat:"<<M.cols<<std::endl;
  float * source_data = (float*) M.data;
  // copying the data into the corresponding pixel
  for (int r = 0; r < rows; r++)
    {
      float* source_row = source_data + (r * rows   * channels);
      for (int c = 0; c < cols ; c++)
    {
      float* source_pixel = source_row + (c * channels);
      for (int ch = 0; ch < channels; ch++)
      {
        std::cout<<"Row:"<<r<<" Col:"<<c<<" Channel:"<<ch<<std::endl;
        std::cout<<"Type check: "<<typeid(T_M(0,r,c,ch)).name()<<std::endl; 
        float* source_value = source_pixel + ch;
        *source_value = T_M(0, r, c, ch);
      }
    }
    }

T_M - Собственный :: Тензор

Сначала я подумал, что получил ошибку от T_M, но это не так.

Я попытался получить доступ к * source_value, и я в основном уверен, что это источник ошибки.

Самое смешное, что я не получаю ошибку в конце или в начале. Я получаю ошибку сегмента в середине. Например, со строками: 915, столбцами: 793 и каналами: 1

Я получаю ошибку в строке: 829 Col: 729 Канал: 0.

Я не могу выяснить источник этой ошибки.

Автор: Alperen AYDIN Источник Размещён: 08.11.2019 11:01

Ответы (2)


2 плюса

Решение

Вы неправильно вычислили свой указатель строки, colsвместо rows:

float* source_row = source_data + (r * cols   * channels);

В общем, вы должны быть очень осторожны, когда используете плоское представление матрицы, она действительно подвержена ошибкам.

Автор: Jean-François Fabre Размещён: 20.08.2016 07:57

2 плюса

Ответ от Жана-Франсуа Фабра сработает, если матрица непрерывна. Если вы не уверены в этом (например, если матрица предоставлена ​​кем-то другим, если вы используете подматрицы и т. Д.), Вы должны использовать функцию widthstep для вычисления указателя строки:

float* source_row = (float*)(M.data + r*M.step);

при этом автоматически используется правильное количество каналов, отступы и т. д.

еще проще использовать функцию row-ptr напрямую:

float* source_row = (float*)(M.ptr(r));
Автор: Micka Размещён: 20.08.2016 09:05
Вопросы из категории :
32x32