打开简历。从网络摄像头的实时馈送中复制或裁剪图像,没有内存泄漏
openCV. copy or crop an image from real time feed from web cam, with out memory leak
我正在尝试找到一种方法来避免在 while 循环中使用 cvCreateImage,因为我意识到这会导致 内存泄漏。
我想要类似 this 的东西 - 尽管没有内存泄漏。
我不知道为什么这段代码不起作用。
下面的代码是我认为可行的,但它在 运行 时中断。
if((capture = cvCreateCameraCapture(0)) == NULL) {
printf("connect cam first\n");
return -1;
}
IplImage *detecImg = cvCreateImage( cvSize(WIDTH, HEIGHT), 8, 1 );
IplImage *frameImage = NULL;
IplImage *notImage = NULL;
while(1){
cvWaitKey(1);
cvSplit(frameImage, a, b, c, NULL);
//detect objec from a,b,c.....output is "detecImg"
cvSetImageROI(detectImg, Roi); //Roi is changing depends on detection result
notImage=cvCloneImage(detectImg);//cvCloneImage,cvCopy not working...
cvNot(notImage, notImage);
copyNotImg = cvCloneImage(notImage);
... continues ...
}
如果我使用下面的这段代码,它可以正常工作,但会泄漏一点内存。
if((capture = cvCreateCameraCapture(0)) == NULL) {
printf("connect cam first\n");
return -1;
}
IplImage *detecImg = cvCreateImage(cvSize(WIDTH, HEIGHT), 8, 1);
IplImage *frameImage = NULL;
IplImage *notImage = NULL;
while(1){
cvWaitKey(1);
cvSplit(frameImage, a, b, c, NULL);
//detect objec from a,b,c.....output is "detecImg"
cvSetImageROI( detectImg, Roi); //Roi is changing depends on detection result
notImage=cvCreateImage( cvSize(Roi.width, Roi.height), 8, 1 );
cvNot(notImage, notImage);
copyNotImg= cvCloneImage(notImage);
... continues ...
}
如有任何见解,我们将不胜感激。
任何用cvCreateImage 分配的图像都需要用cvReleaseImage 释放。您要发布所有图片吗?
或者,您可以使用现代 C++ OpenCV api 为您处理所有内存分配和释放。
在您的第一段代码中,您试图将图像复制为空图像。图像必须分配足够的内存资源。即
IplImage *notImage = NULL;
notImage=cvCloneImage(detectImg);
此处notImage为空。它没有分配内存。因此你的代码中断了。
而在第二种情况下,内存在复制前分配给 notImage。
要避免内存泄漏试试这个
IplImage* notImage=cvCloneImage(detectImg);
不过记得最后把图放出来
代替cvCloneImage,首先创建图像然后使用cvCopyImage复制图像..
新版本的 opencv 提供了更好更简单的实现。
http://www.cprogramdevelop.com/4885055/
上面 link 包含一些关于内存泄漏的信息
希望这有帮助
我正在尝试找到一种方法来避免在 while 循环中使用 cvCreateImage,因为我意识到这会导致 内存泄漏。
我想要类似 this 的东西 - 尽管没有内存泄漏。
我不知道为什么这段代码不起作用。
下面的代码是我认为可行的,但它在 运行 时中断。
if((capture = cvCreateCameraCapture(0)) == NULL) {
printf("connect cam first\n");
return -1;
}
IplImage *detecImg = cvCreateImage( cvSize(WIDTH, HEIGHT), 8, 1 );
IplImage *frameImage = NULL;
IplImage *notImage = NULL;
while(1){
cvWaitKey(1);
cvSplit(frameImage, a, b, c, NULL);
//detect objec from a,b,c.....output is "detecImg"
cvSetImageROI(detectImg, Roi); //Roi is changing depends on detection result
notImage=cvCloneImage(detectImg);//cvCloneImage,cvCopy not working...
cvNot(notImage, notImage);
copyNotImg = cvCloneImage(notImage);
... continues ...
}
如果我使用下面的这段代码,它可以正常工作,但会泄漏一点内存。
if((capture = cvCreateCameraCapture(0)) == NULL) {
printf("connect cam first\n");
return -1;
}
IplImage *detecImg = cvCreateImage(cvSize(WIDTH, HEIGHT), 8, 1);
IplImage *frameImage = NULL;
IplImage *notImage = NULL;
while(1){
cvWaitKey(1);
cvSplit(frameImage, a, b, c, NULL);
//detect objec from a,b,c.....output is "detecImg"
cvSetImageROI( detectImg, Roi); //Roi is changing depends on detection result
notImage=cvCreateImage( cvSize(Roi.width, Roi.height), 8, 1 );
cvNot(notImage, notImage);
copyNotImg= cvCloneImage(notImage);
... continues ...
}
如有任何见解,我们将不胜感激。
任何用cvCreateImage 分配的图像都需要用cvReleaseImage 释放。您要发布所有图片吗?
或者,您可以使用现代 C++ OpenCV api 为您处理所有内存分配和释放。
在您的第一段代码中,您试图将图像复制为空图像。图像必须分配足够的内存资源。即
IplImage *notImage = NULL;
notImage=cvCloneImage(detectImg);
此处notImage为空。它没有分配内存。因此你的代码中断了。 而在第二种情况下,内存在复制前分配给 notImage。
要避免内存泄漏试试这个
IplImage* notImage=cvCloneImage(detectImg);
不过记得最后把图放出来
代替cvCloneImage,首先创建图像然后使用cvCopyImage复制图像.. 新版本的 opencv 提供了更好更简单的实现。
http://www.cprogramdevelop.com/4885055/ 上面 link 包含一些关于内存泄漏的信息 希望这有帮助