2013-12-08 2 views
5

Этот код генерирует исключение только в режиме отладки. В версии, это дает ожидаемый результат 0.OpenCV mat :: at throwing exception

#include <opencv2\opencv.hpp> 
#include <iostream> 
using namespace cv; 
using namespace std; 
int main(){ 
    Mat image; 
    image = Mat::zeros(5,5,CV_8UC1); 
    try{ 
     cout<< image.at<unsigned int>(1,1)<<"\n"; 
    } 
    catch(Exception ex){ 
     cout<< ex.msg; 
    } 
    cin.get(); 
    return 0; 
} 

Текст исключения брошенной является

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

Версия OpenCV является 2.4.6, а исполняемый файл динамически связана с библиотекой отладки ,

+2

Я не эксперт OpenCV, но, возможно, вы определяете матричные элементы, как 'беззнаковое char' но вы просите для' беззнаковое int' И что в mat.hpp, линия 537? – ThomasMcLeod

+0

Спасибо за ответ. Изменение параметра шаблона в unsigned char заставляет программу ничего не выводить (исключение тоже) – Tim

+0

Строка с 533 по 539 из Mat.hpp - это 'template inline _Tp & Mat :: at (int i0, int i1) { CV_DbgAssert (dims <= 2 && data && (unsigned) i0 <(unsigned) size.p [0] && (без знака) (i1 * Тип данных <_Tp> :: каналы) <(без знака) (size.p [1] * каналы ()) && CV_ELEM_SIZE1 (DataType <_Tp> :: depth) == elemSize1()); return ((_Tp *) (data + step.p [0] * i0)) [i1]; } ' – Tim

ответ

5
  1. Исключение произошло потому, что вы определили изображение как массив беззнаковых символов, но используется без знака Int внутри в <> функции. при <> должен иметь тот же тип, что и ваша матрица, т. е. неподписанный символ. В противном случае он выдает исключение, которое вы видите.

  2. Когда вы предоставляете unsigned char для функции cout, предполагается, что вы пытаетесь напечатать символ (char), а не число. Если вы хотите, чтобы увидеть его числовое значение брось в целое:

    < < соиЬ (интермедиат) image.at < неподписанные символ> (1,1) < < "\ п";

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