У меня проблема с освобождением памяти, выделенной для IplImage . Я столкнулся с ситуацией, аналогичной описанной ниже в моем приложении (она отражает ту же ошибку, что и в моем приложении.)
Но вместо строки
char* originalData=loadedImage->imageData;
Я получаю свои "originalData" из класса QT QImage.
Код падает на линии, где я освобождаю "image_gray".
cvReleaseImage(&img_gray); // <-- crashes
Сообщение об ошибке -
Ошибка OpenCV: утверждение не выполнено (udata <(uchar *) ptr && ((uchar *) ptr -
udata) <= (ptrdiff_t) (sizeof (void *) + 16)) в файле fastFree
C: \ opt \ OpenCV-2.2.0 \ modules \ co e \ src \ alloc.cpp, строка 76 завершается
вызывается после создания экземпляра cv :: Exception what ():
C: \ opt \ OpenCV-2.2.0 \ modules \ core \ src \ alloc.cpp: 76: ошибка: (-215)
<(uchar *) ptr && ((uchar *) ptr - udata) <=
(ptrdiff_t) (sizeof (void *) + 16) в функции fastFree </p>
Но если я использую cvReleaseImageHeader () , если работает нормально, но оставляет утечку памяти.
Есть предложения, пожалуйста?
void test2( char *imageFileName)
{
IplImage *loadedImage=cvLoadImage(imageFileName);
int xsize=loadedImage->width;
int ysize=loadedImage->height;
int totalBytes=xsize*ysize;
//In my application this "originalData" data comes from a QT QImage.
char* originalData=loadedImage->imageData;
unsigned char* datacopy = new unsigned char [totalBytes];
memcpy(datacopy, originalData, totalBytes);
IplImage* img_gray = cvCreateImage( cvSize(xsize, ysize), IPL_DEPTH_8U, 1 );
IplImage* img_gray_copy = cvCreateImage( cvSize(xsize, ysize), IPL_DEPTH_8U, 1 );
IplImage* img_edge = cvCreateImage( cvSize(xsize, ysize), IPL_DEPTH_8U, 1 );
IplImage* img_mask = cvCreateImage(cvSize(xsize, ysize), IPL_DEPTH_8U, 1);
cvSet(img_mask, cvScalar(255));
cvSet(img_gray_copy, cvScalar(255));
cvSetZero(img_mask);
cvSetData(img_gray, datacopy, xsize);
cvCopy(img_gray, img_gray_copy, img_mask);
//cvThreshold(img_gray_copy, img_edge, threshold, 255, CV_THRESH_BINARY_INV);
//cvFindContours(img_edge, storage, contours, sizeof(CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
cvReleaseImage(&img_gray); /// <--- this crashes the application
//cvReleaseImageHeader(&img_gray); //<--- this works.but leaving a memory leak ???
cvReleaseImage(&img_gray_copy);
cvReleaseImage(&img_edge);
cvReleaseImage(&img_mask);
}