显示视频中的所有帧以及每个帧中的一些子图像。该子图像可以改变大小并从原始帧的不同位置拍摄。
所以,我写的代码基本上是这样的:
-
cvQueryFrame公司
-
创建新的
限制
(img)具有子图像尺寸(窗口.高度,窗口.宽度)
-
创建新的
Cvmat公司
(mat)具有子图像尺寸(窗.高,窗.宽)
-
-
使用将Mat(cvMat)转换为img(IplImage)
我的问题是,对于每一帧,我都会创建新的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(&黑色);
我使用的是带有opencv2.0的ubuntu9.10。
有谁能告诉我如何纠正这个问题,或者更好地解释如何正确地执行图像窗口?
谢谢你