gpt4 book ai didi

c++ - 从视频中获取子图像的内存泄漏 (cvGetSubRect)

转载 作者:太空宇宙 更新时间:2023-11-03 23:04:41 33 4
gpt4 key购买 nike

我正在尝试进行视频窗口化:

显示视频中的所有帧以及每个帧中的一些子图像。此子图像可以改变大小并从原始帧的不同位置获取。

所以,我编写的代码基本上是这样做的:

  1. cvQueryFrame 从视频中获取新图像
  2. 创建一个新的 IplImage (img) 子图像尺寸 (window.height,window.width)
  3. 创建一个新的 Cvmat (mat) 子图像尺寸 (window.height,window.width)
  4. CvGetSubRect(originalImage,mat,window) 抓取子图
  5. 使用 cvGetImage 将 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(&bk); 产生分割错误。请注意,我正在尝试释放我在 bk 变量中备份的前一个子帧。如果我评论这一行程序运行顺利但有很多内存泄漏

我正在使用 ubuntu 9.10 和 opencv 2.0。

我真的需要摆脱内存泄漏,任何人都可以向我解释如何纠正这个问题,或者更好地解释如何正确执行图像窗口化吗?

谢谢

最佳答案

有人报告了与库中的错误相同的问题。 http://sourceforge.net/tracker/index.php?func=detail&aid=3025393&group_id=22870&atid=376677

我通过在图像中使用 ROI 而不是 cvGetSubRect 解决了这个问题,这样就可以避免分配另一个垫子。

关于c++ - 从视频中获取子图像的内存泄漏 (cvGetSubRect),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2941488/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com