......
IplImag *img = cvCreateImage( cvSize(frame->width,frame->hight), frame->depth, frame->nChannels );
img = cvCloneImage(frame);
这里出现内存泄露,因为调用cvCloneImage()之前已经用cvCreateImage()为图像分配了内存空间,而cvCloneImage()函数是对源图像的所有数据的拷贝,包括图像头、数据、ROI等,这就导致原来分配的内存空间变成了内存碎片,造成内存泄露。.解决方法如下:
IplImag *img = cvCloneImage(frame);
或
IplImag *img = cvCreateImage( cvSize(frame->width,frame->hight), frame->depth, frame->nChannels );
cvReleaseImage(&img);
img = cvCloneImage(frame);
或
IplImag *img = cvCreateImage( cvSize(frame->width,frame->hight), frame->depth, frame->nChannels );
img = cvCloneImage(frame);
cvCopy(frame,img,NULL);
2. cvGetCols()、cvGetRows()
......
CvMat *srcMat = cvCreateMat(width, height, CV_8UC3); // 创建一个三通道无符号整数类型的矩阵
cvGetCols(frame,srcMat,0,width);
这里出现内存泄露,因为cvGetCols()、cvGetRows() 是为目标矩阵分配一块新的数据内存区域,如果目标矩阵的数据区域之前已经分配了内存,则会原始数据内存区域将变成内存碎片,造成内存泄露。解决方法如下:
CvMat *srcMat = cvCreateMat(width, height, CV_8UC3); // 创建一个三通道无符号整数类型的矩阵
cvReleaseData(srcMat); // 先释放目标矩阵的数据区
cvGetCols(frame,srcMat,0,width);
或者
cvCreateMatHeader(width, height, CV_8UC3);
cvGetCols(frame,srcMat,0,width);
3. IplImag*、CvMat*、CvHistogram* 等结构体指针在使用后要释放。
IplImage *frame= cvCreateImage(cvSize(width,height),8,1);
CvMat *srcMat = cvCreateMat(width, height, CV_8U);
......
CvHistogram *hist = cvCreateHist(1,&histSize,CV_HIST_ARRAY,ranges,1);
......
cvReleaseMat(&srcMat);
cvReleaseImage(&frame);
cvReleaseHist(&hist);