qawaq 0 Жалоба Опубликовано October 21, 2012 функции void Roia(IplImage* img,int x,int y) { IplImage* fra=0; fra = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1 ); cvConvertImage(img,fra); cv::Mat tr=fra; for( int i=x-5;i<x+5;i++) { for( int j=y-5;j<y+5;j++) { q[ii]=tr.at<uchar>(i,120)+q[ii]; } }; q[ii]=q[ii]/100; ~cv::Mat(tr); } // обработчик событий от мышки void myMouseCallback( int event, int x, int y, int flags,void* param ) { IplImage* img = (IplImage*) param; switch( event ){ case CV_EVENT_MOUSEMOVE: break; case CV_EVENT_LBUTTONDOWN: printf("%d x %d\n", x, y); Roia(img,x,y); xx[ii]=x; yy[ii]=y; ii=ii+1; break; case CV_EVENT_LBUTTONUP: break; } } Идёт видео, я нажимаю на окно, по клику мышки функция cvSetMouseCallback( "capture", myMouseCallback, (void*) frame); определяет координаты клика и вызывает Roia(img,x,y), которая считает среднее значение цвета. После пятого нажатия мышки вылетает ошибка, необработаное исключение, в консоли пишет: 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:\1\opencv\build\inc lude\opencv2/core/mat.hpp, line 552 и ссылается на: 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]; } в файле Mat.hpp __________________________________ В чём может быть собака? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано October 21, 2012 Может быть лучше перевести все на cv::Mat или IplImage, а не мешать их, иначе получается ерунда всякая: Создаете IplImage fra = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1 ); а освобождаете cv::Mat, кстати, его или не освобождают явно (деструктор вызывается при выходе из блока), или используют метод release(); ~cv::Mat(tr); Что касается отладки, то посмотрите стек вызовов, там выберите наиболее адекватное ситуации место (формат: название файла; название функции; строка с ошибкой): Отладчик выбросит вас в это место. Дальше посмотрите значения переменных. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qawaq 0 Жалоба Опубликовано October 22, 2012 for( int i=x-5;i<x+5;i++) { for( int j=y-5;j<y+5;j++) { q[ii]=tr.at<uchar>(i,120)+q[ii]; } }; проблема была в том, что координаты в этом месте вылезали иногда за пределы рисунка... запутался в ориентации по Cv::Mat там не (x,y) а (y,x) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах