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

Posted

技术标签:

【中文标题】发布 OpenCV IplImage 会使应用程序崩溃?【英文标题】:Releasing OpenCV IplImage crashes the application? 【发布时间】:2011-10-03 09:08:43 【问题描述】:

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

但不是一行

char* originalData=loadedImage->imageData;

我从 QT QImage 类中获得了我的“originalData”。 代码在我释放“image_gray”的那一行崩溃。

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

错误信息 -

OpenCV 错误:断言失败 (udata

但如果我改用 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】:

好的,找到了问题。 我应该为 img_gray 使用 cvCreateImageHeader() 。然后手动删除分配的内存。

【讨论】:

以上是关于发布 OpenCV IplImage 会使应用程序崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

opencv:将 Mat 转换为 IplImage 问题

opencv——IplImage结构

如何将 8 位 OpenCV IplImage* 转换为 32 位 IplImage*?

OpenCV 用 Mat 替换 IplImage

从 Mat 元素到 IplImage 的 opencv 转换 *

OpenCV - 如何以 Mat 形式编写 IplImage 数组?