При выпуске OpenCV IplImage происходит сбой приложения? - PullRequest
0 голосов
/ 03 октября 2011

У меня проблема с освобождением памяти, выделенной для 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);



}

1 Ответ

0 голосов
/ 03 октября 2011

ОК, нашел проблему.Я должен был использовать cvCreateImageHeader () для img_gray . И затем вручную удалить выделенную память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...