opencv视频显示很卡,很慢,内存泄露
我这线程函数是显示视频,其中每一帧我调用我的videorunhs(IplImage*img,IplImage*mo)来处理,可能是内存释放不到位,引起播放是很慢,而且内存...
我这线程函数是显示视频,其中每一帧我调用我的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;
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
{
}
}
不知是哪里出错还请,各位多多指教..... 展开
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;
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
{
}
}
不知是哪里出错还请,各位多多指教..... 展开
2个回答
展开全部
由于我没法调试你的程序,只能凭着分析,也不一定对,仅供参考:
你的视频卡的原因我猜测
1:Sleep(40);这里是程序挂起40ms,一秒钟为25帧,如果图像卡,可以试试把这个40变小。不过太小了可能会程序执行出错,因为可能出现空指针。
2:然后就是你图像处理的过程可能耗费时间挺多,这个问题你得试着优化程序。
还有就是你的内存溢出,个人觉得 newframe = cvCloneImage (frame);的原因,cvCloneImage这个函数是会申请内存的。建议release一下试试
你的视频卡的原因我猜测
1:Sleep(40);这里是程序挂起40ms,一秒钟为25帧,如果图像卡,可以试试把这个40变小。不过太小了可能会程序执行出错,因为可能出现空指针。
2:然后就是你图像处理的过程可能耗费时间挺多,这个问题你得试着优化程序。
还有就是你的内存溢出,个人觉得 newframe = cvCloneImage (frame);的原因,cvCloneImage这个函数是会申请内存的。建议release一下试试
展开全部
你newframe忘了释放了吧
追问
我是在调用函数的时候释放的,而且我也试过在函数外边把newframe释放,还是不行,应该是内存泄露,内存消耗以每秒4m的速度上升....
追答
释放最好是在申请的同一层里面释放,如果你在函数里面释放,最好传进去newframe的引用或者说参数的地址,在你给出来的这几句代码里是看不出来有什么内存泄露了,也可能在你的函数里,下个boundscheck查一下就知道了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询