打开简历。从网络摄像头的实时馈送中复制或裁剪图像,没有内存泄漏

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 包含一些关于内存泄漏的信息 希望这有帮助