我这线程函数是显示视频,其中每一帧我调用我的videorunhs(IplImage* img,IplImage *mo)来处理,可能是内存释放不到位,引起播放是很慢,而且内存在慢慢的增长,,,请各位看看看是哪出错了
UINT CtestDlg:: videorun(LPVOID IpParamater)
{
CtestDlg *pDlg  = (CtestDlg*)IpParamater;
CString filename = ((PARAMATER*)IpParamater)->path;
CvCapture *capture = NULL;
capture=cvCaptureFromAVI(filename);
 
int framesum = (int) cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_COUNT );
int numfrm = 0; IplImage* frame =NULL;
IplImage * newframe= NULL;

IplImage *mo = NULL;
newframe=cvCreateImage(cvSize(frame->width, frame->height),  IPL_DEPTH_8U,1);
while(numfrm < framesum)
{
numfrm ++;
frame = cvQueryFrame(capture);
mo = cvLoadImage("..\\resource\\mo.bmp",1);

newframe = cvCloneImage (frame);


pDlg->videorunhs(newframe,mo); //此处调用函数

if(cvWaitKey(1)==27||stop==0) 
return 0;
Sleep(40);

 } cvReleaseCapture(&capture);

return 0;
}
void CtestDlg::videorunhs(IplImage* img,IplImage *mo)
{
if(img)
{
........
                 ...........
                 ............////由于太长省略处理具体过程,主要就是把img处理后全部放在mo中,这期间没有任何cvcreate和cvRelease操作


cvReleaseImage(&img);
cvReleaseImage(&mo);
}

else
{

}
}
不知是哪里出错还请,各位多多指教.....

解决方案 »

  1.   

    要释放newframe ,cvcloneimage函数容易引起内存泄露,你可以查查看这个函数
      

  2.   

    每次while一次后就cvReleaseImage。。
      

  3.   

    我看到了cvCreateImage,cvclone,看不到cvReleaseImage,你说怎么可能不内存泄露
      

  4.   

    至于帧率的问题,可以获取属性CV_CAP_PROP_FPS查看,还可以通过cvSetCaptureProperty
    进行设置
      

  5.   

    cvCreateImage,cvclone里面如果有new或者深拷贝,肯定是开辟内存的。
      

  6.   

    应该是内存释放的问题,create了,,就要release,,这是原则,仔细检查下循环
      

  7.   

    从你的代码中,惟一的内存泄露就是newframe=cvCreateImage(cvSize(frame->width, frame->height),  IPL_DEPTH_8U,1);这一句生成的内存没释放,但这应该不会引起内存慢慢增长的(因为它所在的函数你经常调用)另外,按照谁申请谁释放原则,建议把videorunhs中的
    cvReleaseImage(&img);
    cvReleaseImage(&mo);
    这两句放在videorun函数中(pDlg->videorunhs(newframe,mo)之后)