我有一個問題,從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();
}
不,這是絕對泄漏OpenCV'或'Qt'的'!我發現只有在主線程以外的線程中調用'cvQueryFrame()'時纔會發生這種情況。而這隻發生在Qt的線程('QThread'的子類),我用'std :: thread'測試過,沒有問題。也許它也適用於POSIXs,(沒有測試過)。我認爲這是一個漏洞,因爲當我打開一個顯示器時,我可以看到程序的內存快速而無限地增長。 (每秒100兆字節)。如果這很重要,瘋狂的成長記憶就在堆上(如顯示器所示)。我嘗試刪除'發送sendImage(主)',但沒有幫助。 – 2012-02-22 19:22:04
你使用什麼OpenCV版本?你需要確保'cvCreateCameraCapture()'在你的程序執行過程中只被調用一次。如果您需要多次調用它,請確保將它與適當的'cvReleaseCapture()'配對。如果你無法解決這個問題,我建議看看[qt-opencv-multithreaded](http://code.google.com/p/qt-opencv-multithreaded/),看看他們是如何做到的。 – karlphillip 2012-02-22 19:59:13
本帖](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