2012-02-21 114 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