发布 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 会使应用程序崩溃?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 8 位 OpenCV IplImage* 转换为 32 位 IplImage*?