2012-02-21 116 views
0

我有一个问题,从IplImage* ... cvQueryFrame内存永远不会被释放库返回。并且文档说:内存泄漏在OpenCV的功能:cvQueryFrame()

返回的图像不应该由用户发布或修改。

嗯...我如何得到我的记忆回来?该程序吃内存,直到它崩溃。我希望在帧处理完成后释放为每个IplImage*分配的内存。代码是这样的:

// In `process` thread: 
CvCapture* camera; 
camera = cvCreateCameraCapture(1); 
assert(camera); 
while(true) 
{ 
    main = cvQueryFrame(camera); 
    // Do something useful with images 
    emit sendImage(main); // Send Image to the UI thread 
} 

UPDATE: 这是QThread子类:

#include <QThread> 
class ImageFetcher : public QThread 
{ 
    Q_OBJECT 
public: 
    explicit ImageFetcher(QObject *parent = 0); 
signals: 
    void run(); 
public slots: 
}; 

Implementattion:

void ImageFetcher::run() 
{ 
    CvCapture* camera = cvCreateCameraCapture(0); 
    IplImage* image; 
    while(true) 
    { 
     image = cvQueryFrame(camera); 
     // process image 
    } 
    // exec(); 
} 

的main():

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc,argv); 
    ImageFetcher thread; 
    thread.start(); 
    return a.exec(); 
} 

回答

1

至于我可以测试,还有在V2.3.1针对Linux的泄漏。

这里是发生了什么:图像由cvQueryFrame()分配时该功能是由第一次调用,然后该图像上的所有后续调用cvQueryFrame()重用。第一次调用后不会创建新图像,并且图像仅在cvReleaseCapture()处释放。

所以你看,如果你遇到内存泄漏(你是怎么找到它,到底是什么?)和崩溃,最可能是你的代码的其他部分造成的。如果sendImage()不同步(即非阻塞),直接传递main图像可能会导致问题。我不知道你在做什么,所以我会认为问题在于它。

您可以做的一项测试是复制main框架,然后将该副本传递给sendImage(),然后在不再需要时将其释放。

+0

不,这是绝对泄漏OpenCV'或'Qt'的'!我发现只有在主线程以外的线程中调用'cvQueryFrame()'时才会发生这种情况。而这只发生在Qt的线程('QThread'的子类),我用'std :: thread'测试过,没有问题。也许它也适用于POSIXs,(没有测试过)。我认为这是一个漏洞,因为当我打开一个显示器时,我可以看到程序的内存快速而无限地增长。 (每秒100兆字节)。如果这很重要,疯狂的成长记忆就在堆上(如显示器所示)。我尝试删除'发送sendImage(主)',但没有帮助。 – 2012-02-22 19:22:04

+0

你使用什么OpenCV版本?你需要确保'cvCreateCameraCapture()'在你的程序执行过程中只被调用一次。如果您需要多次调用它,请确保将它与适当的'cvReleaseCapture()'配对。如果你无法解决这个问题,我建议看看[qt-opencv-multithreaded](http://code.google.com/p/qt-opencv-multithreaded/),看看他们是如何做到的。 – karlphillip 2012-02-22 19:59:13

+0

本帖](http://stackoverflow.com/questions/6132946/parallelize-opencv-processing-with-qt)也可能包含一些有趣的信息。你有没有考虑过使用[QtConcurrent](http://doc.qt.nokia.com/4.7/qtconcurrent.html)?我希望看到一个能够再现您正在观察的问题的最小示例。 =) – karlphillip 2012-02-22 20:04:47