Some IplImage release probilem.
1. ) never release
a.) situation
IplImage* iplImgA = cvCreateImage( cvSize( WIDTH, HEIGHT ) , IPL_DEPTH_8U , 3 ); IplImage* iplImgB = cvCreateImage( cvSize( WIDTH, HEIGHT ) , IPL_DEPTH_8U , 3 ); /* processing */
b.) solution
IplImage* iplImgA = cvCreateImage( cvSize( WIDTH, HEIGHT ) , IPL_DEPTH_8U , 3 ); IplImage* iplImgB = cvCreateImage( cvSize( WIDTH, HEIGHT ) , IPL_DEPTH_8U , 3 ); /* processing */ cvReleaseImage( & iplImgA );
cvReleaseImage( & iplImgB );
2. ) wrong release
a.) situation
IplImage* iplImgA = cvCreateImage( cvSize( WIDTH, HEIGHT ) , IPL_DEPTH_8U , 3 ); IplImage* iplImgB = cvCreateImage( cvSize( WIDTH, HEIGHT ) , IPL_DEPTH_8U , 3 ); /* processing */ iplImgB = iplImgA; // (err a) iplImgB = cvCloneImage( iplImgA ); // (err b) cvReleaseImage( & iplImgA ); cvReleaseImage( & iplImgB );
err a :
ptr iplImgA -> [ .... IplImage Data .... ]
ptr iplImgB↗ [ .... IplImage Data .... ] ( no release )
err b:
ptr iplImgA -> [ .... IplImage Data .... ]
ptr iplImgB↘ [ .... IplImage Data .... ] ( no release )
[ .... IplImage Data .... ] ( cvCloneImage )
b.) solution
IplImage* iplImgA = cvCreateImage( cvSize( WIDTH, HEIGHT ) , IPL_DEPTH_8U , 3 ); IplImage* iplImgB = cvCreateImage( cvSize( WIDTH, HEIGHT ) , IPL_DEPTH_8U , 3 ); /* processing */ cvReleaseImage( & iplImgB ); iplImgB = cvCloneImage( iplImgA ); // (sol 1) cvCopy( iplImgA , iplImgB ); // (sol 2) cvReleaseImage( & iplImgA ); cvReleaseImage( & iplImgB );
sol 1: Before cvCloneImage(), cvReleaseImage() first, if pointer is not NULL.
sol 2: Using cvCopy() to replace IplImage data.
3. ) function return
a.) situation
IplImage* returnImgB(IplImage* iplImgA) { IplImage* iplImgB = cvCreateImage( cvSize( WIDTH, HEIGHT ) , IPL_DEPTH_8U , 3 ); /* processing */ return iplImgB; } void replaceImgB(IplImage* iplImgA, IplImage* iplImgB) { IplImage* iplImgTemp = cvCreateImage( cvSize( WIDTH, HEIGHT ) , IPL_DEPTH_8U , 3 ); /* processing */ cvCopy( iplImgTemp , iplImgB ); cvReleaseImage( & iplImgTemp ); }
b.) solution
(1) Before call function, set the pointer as NULL first.
IplImage* iplImgA = cvCreateImage( cvSize( WIDTH, HEIGHT ) , IPL_DEPTH_8U , 3 ); IplImage* iplImgB = NULL; iplImgB = returnImgB( iplImgA ); /* show image */ cvReleaseImage( & iplImgA ); cvReleaseImage( & iplImgB );
(2) Before call function, create the image first.
IplImage* iplImgA = cvCreateImage( cvSize( WIDTH, HEIGHT ) , IPL_DEPTH_8U , 3 ); IplImage* iplImgB = cvCreateImage( cvSize( WIDTH, HEIGHT ) , IPL_DEPTH_8U , 3 ); replaceImgB( iplImgA , iplImgB ); /* show image */ cvReleaseImage( & iplImgA ); cvReleaseImage( & iplImgB );
留言列表