发布OpenCV IplImage会崩溃应用程序吗?

时间:2011-10-03 09:08:43

标签: c memory memory-management opencv

我在释放为 IplImage 分配的内存时遇到了问题。我给出了与我的应用程序类似的情况。(它反映了我的应用程序中出现的相同错误。)

但不是行

char* originalData=loadedImage->imageData;

我得到了我的" originalData"来自QT QImage课程。 代码崩溃在我自由的行#34; image_gray"。

cvReleaseImage(&img_gray); // <-- crashes

错误讯息 -

  

OpenCV错误:断言失败(udata&lt;(uchar *)ptr&amp;&amp;((uchar *)ptr -   udata)&lt; =(ptrdiff_t)(sizeof(void *)+ 16))在fastFree中,文件   C:\ opt \ OpenCV-2.2.0 \ modules \ co e \ src \ alloc.cpp,第76行终止   抛出&#39; cv :: Exception&#39;的实例后调用什么():   C:\ opt \ OpenCV-2.2.0 \ modules \ core \ src \ alloc.cpp:76:错误:(-215)uda a   &LT; (uchar *)ptr&amp;&amp; ((uchar *)ptr - udata)&lt; =   函数fastFree中的(ptrdiff_t)(sizeof(void *)+ 16)

但是,如果我使用 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 :(得分:0)

好的发现了这个问题。 我应该为 img_gray 使用 cv CreateImageHeader()。然后手动删除已分配的内存。