2013-11-26 4 views
3

http://pastebin.com/5ZeMvm2C - это мой заголовочный файл в моем проекте.Ошибка OpenCV: утверждение не выполнено, строка mat.cpp 537

Есть skeleton.at (YAxis, Xaxis + 1) в строке 249. Когда я печатаю этот код в моем проекте я получил эту ошибку:

**OpenCV Error: Assertion failed (dims <= 2 && data && (unsigned)i0 < (unsigned)si 
ze.p[0] && (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channel 
s()) && ((((sizeof(size_t)<<28)|0x8442211) >> ((DataType<_Tp>::depth) & ((1 << 3 
) - 1))*4) & 15) == elemSize1()) in unknown function, file c:\opencv\build\inclu 
de\opencv2\core\mat.hpp, line 537** 

// mat.cpp line 537 is: 
    template<typename _Tp> inline _Tp& Mat::at(int i0, int i1) 
     { 
      CV_DbgAssert(dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] && 
       (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels()) && 
       CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1()); 
      return ((_Tp*)(data + step.p[0]*i0))[i1]; 
     } 

Что случилось?

http://pastebin.com/gqJ5RpBU также является моим файлом .cpp.

ответ

4

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

Как вы писали в своем вопросе, неудавшееся утверждение находится внутри функции Mat::at.

Вы должны найти в своем коде звонок (или звонки) до Mat::at, который даст вам ошибку.

Как вы можете видеть на OpenCV help pageMat::at является функцией шаблон с одним, двумя или тремя аргументами, отказ в утверждении может иметь различные причины:

  1. вы используете неправильный параметр шаблона (см пример Using Mat::at(i,j) in opencv for a 2-D Mat object)
  2. аргументы неверны, например, при вызове template<typename T> T& Mat::at(int i, int j), i должен быть между 0 и числом строк минус один, j должен быть между 0 и числом столбца минус один. Если у вас есть изображение со 100 строками, и вы запрашиваете элемент в строке 101, утверждение не будет выполнено. Off-by-one errors являются общими в этом случае.

Чтобы быть более конкретным, то утверждение не удалось, поскольку по меньшей мере один из следующих bool х является false:

  1. dims <= 2
  2. data
  3. (unsigned)i0 < (unsigned)size.p[0]
  4. (unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels())
  5. CV_ELEM_SIZE1(DataType<_Tp>::depth) == elemSize1())

Вышеуказанные bool s имеют смысл в пределах Mat класс.

Кроме того, пожалуйста, обратите внимание, что помощь говорит, что:

For the sake of higher performance, the index range checks are only performed in the Debug configuration

и поэтому в конфигурации Release вы не отказавший утверждение, но, вероятно, где-то сбой.

От источника, с которым вы связались, мне кажется, что вы находитесь в Windows, если это правда, и если у вас есть Visual Studio, я предлагаю вам создать OpenCV из исходного кода, чтобы установить точку останова внутри Mat::at, а затем для отладки кода, чтобы узнать, что из предыдущего bool s - false.

+0

для других читателей: вы можете просто поставить точку останова на строку ошибки, и когда она попадет, используйте шаг в кнопке в VS, чтобы перейти к mat.cpp-файлу и посмотреть значение 'data',' dims', size.p [0], ... поэтому вы можете найти, какое значение вызывает ошибку – Arash

0

Mat::at() метод был реализован как шаблон, вы должны знать тип изображения, прежде чем использовать эту функцию.

Проверьте каналы изображения. для одного канала изображения (8UC1), вы должны манипулировать пиксели изображения, как в:

image.at<uchar>(row, col) = 255; 

для три цветовых канала изображения (8UC3), вы должны использовать функцию как в:

image.at<cv::Vec3b>(row, col)[channel] = 255; 

если канал не проблема, вы должны проверить аргументы at(i, j), я представляю строку, j представляет col. другими словами, i равно Point.y, j, равному Point.x.

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