2011-10-03 2 views
0

나는 문제가 아래에있는 내 응용 프로그램에서와 유사한 상황을 준 IplImage .I에 할당 된 메모리를 확보해야합니다. (동일한 버그가 내 응용 프로그램에서 발생 반영한다.)OpenCV IplImage를 해제하면 응용 프로그램이 충돌합니까?

하지만 그 대신 라인

char* originalData=loadedImage->imageData; 

"originalData"는 QT QImage 클래스에서 가져옵니다. "image_gray"를 무료로 사용하는 줄에서 코드가 충돌합니다.

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

오류 메시지 -

OpenCV Error: Assertion failed (udata < (uchar*)ptr && ((uchar*)ptr - udata) <= (ptrdiff_t)(sizeof(void*)+16)) in fastFree, file C:\opt\OpenCV-2.2.0\modules\co e\src\alloc.cpp, line 76 terminate called after throwing an instance of 'cv::Exception' what(): C:\opt\OpenCV-2.2.0\modules\core\src\alloc.cpp:76: error: (-215) uda a < (uchar*)ptr && ((uchar*)ptr - udata) <= (ptrdiff_t)(sizeof(void*)+16) in fu ction fastFree

하지만 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); 



} 

답변

0

확인 결과. cvCreateImageHeader()img_gray에 대해 사용 했어야합니다. 그런 다음 할당 된 메모리를 수동으로 삭제하십시오.

관련 문제