2014-09-30 6 views
0

я получаю утверждение не удалось ошибку в строке 537 Мат :: наOpenCV Mat :: в строке 537 Assertion Failed Ошибка

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:\users\tim\document s\code\opencv\build\include\opencv2\core\mat.hpp, line 537

Я пытаюсь заполнить матрицы, которые я буду использовать в функции сорта: : переназначить. Часть кода, который вызывает это утверждение не удалось ниже:

void Functions::PopulatedMapY(Mat image) 
{ 
    mapy.create(image.rows, image.cols, CV_32FC1); 
    for (int j = 0; j<image.rows; j++) 
    { 
     float a = (image.rows - 1) - gazey; 
     float b = (image.cols - 1) - gazex; 
     for (int i = 0; i<image.cols; i++) 
     {  
      mapy.at<float>(j,i) = map2y.at<float>(a+j,b+i); 
     } 
    } 
} 

Матрица map2y была определена в MapCreator функции следующим образом:

void Functions::MapCreator(Mat image, float const_a, float const_b) 
{ 
    map2x.create(2*image.rows, 2*image.cols, CV_32FC1); 
    map2y.create(2*image.rows, 2*image.cols, CV_32FC1); 

    for (int m = 0; m<2*image.rows; m++) 
    { 
     ty = image.rows - m; 
     for (int n = 0; n<2*image.cols; n++) 
     { 
      tx = image.cols - n; 
      map2x.at<float>(m,n) = n; 
      map2y.at<float>(m,n) = m +const_b*exp(-pow(tx,2)/pow(const_a, 2))*Signum(ty); 

    } 
    } 

} 

Любая помощь будет высоко ценится!

+0

Привет, вы можете предоставить больше информации, как значения I и J, когда он выходит из строя, и значения gazey и ГАЗЭКСа. –

+0

Привет, gazey и gazex могут варьироваться от 0 до image.rows - 1 и image.cols - 1 соответственно. Программа компилируется и вылетает, как только она запускается. Есть ли способ узнать значение I и j, когда он сработает? Благодаря! – ElementaryParticle

+0

btw a и b должны быть ints ... вы должны попытаться получить доступ к индексам, которые не плавают. a + i должен быть int. –

ответ

0

Из вашего кода ошибки вы можете обнаружить, что утверждение поступило неверно после вызова Mat::at, и внутри этого метода ваш код переходит в ложь, если:
a. Nr. каналов меньше 2.
b. data is null
c. (без знака) i0 < (без знака) size.p [0]
плюс некоторые другие.
Мое предложение в вашем случае - nr. каналов. CV_32FC1 означает следующее:
CV_ < bit_depth> (S | U | F) C < nr_channels>. Я полагаю, что здесь проблема, параметр шаблона или данные являются нулевыми.
Мое решение просто использует CV_32F.
Как большой ссылки, посмотрите здесь:
OpenCV Error: Assertion failed, mat.cpp line 537

+0

Привет, Андрэ, спасибо, что вернулись ко мне. Я не считаю, что проблема CV_32FC1. Я могу запустить программу без ошибки, если вручную установить gazex и gazey для определенных значений. В идеальных условиях gazex и gazey должны быть действительны для image.cols-1 и image.rows-1 соответственно. Однако при любом значении выше image.rows/2 + 1 и image.cols/2 + 1 возникает ошибка с ошибкой утверждения. Это указывает на то, что проблема заключается в том, как я заполнил матрицы. Я посмотрю на это немного и посмотрю, сделал ли я большую ошибку. Если нет, я опубликую все эти функции, которые я использую, и основной файл cpp. – ElementaryParticle

+0

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

+0

Спасибо за ваш вклад. На данный момент я уверен, что это связано с данными, что является прямым результатом того, как я заполняю матрицы. Я думаю, что есть недостаток в моей логике. Я попытаюсь отладить его некоторое время, и если я не смогу, я опубликую все это с объяснением того, что я думаю. Было бы здорово, если бы вы могли взглянуть на это в этот момент. – ElementaryParticle

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