我正在尝试进行视频窗口:
显示视频中的所有帧以及每帧中的一些子图像。该子图像可以改变尺寸并从原始帧的不同位置拍摄。
所以,我写的代码基本上是这样的:
我的问题是,对于每个帧,我创建新的IplImage和cvMat,它占用大量内存,当我尝试释放分配的内存时,我得到分段错误,或者在CvMat的情况下,分配的空间不会自由(valgrind一直告诉我它绝对失去了空间)。
以下代码执行此操作:
int
main(void){
CvCapture* capture;
CvRect window;
CvMat * tmp;
//window size
window.x=0;window.y=0;window.height=100;window.width=100;
IplImage * src=NULL,*bk=NULL,* sub=NULL;
capture=cvCreateFileCapture( "somevideo.wmv");
while((src=cvQueryFrame(capture))!=NULL){
cvShowImage("common",src);
//get sub-image
sub=cvCreateImage(cvSize(window.height,window.width),8,3);
tmp =cvCreateMat(window.height, window.width,CV_8UC1);
cvGetSubRect(src, tmp , window);
sub=cvGetImage(tmp, sub);
cvShowImage("Window",sub);
//free space
if(bk!=NULL)
cvReleaseImage(&bk);
bk=sub;
cvReleaseMat(&tmp);
cvWaitKey(20);
//window dimensions changes
window.width++;
window.height++;
}
}
cvReleaseMat(安培; TMP);似乎没有对丢失的内存总量产生任何影响,如果我评论或取消注释此行,valgrind会报告相同数量的“绝对丢失”内存。
cvReleaseImage(& bk); 会产生分段错误。注意我正试图释放我在bk变量中备份的前一个子帧。如果我评论这一行,程序运行顺利,但有很多内存泄漏
我正在使用ubuntu 9.10和opencv 2.0。
我真的需要摆脱内存泄漏, 任何人都可以解释我如何纠正这个甚至更好的如何正确执行图像窗口?
谢谢
答案 0 :(得分:1)
有人报告了与库中的错误相同的问题。 http://sourceforge.net/tracker/index.php?func=detail&aid=3025393&group_id=22870&atid=376677
我通过在图像中使用ROI而不是cvGetSubRect来解决它,这样就可以避免分配另一个垫子。