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 );
 

 

 

arrow
arrow

    Cuby 56 發表在 痞客邦 留言(0) 人氣()