我有一个问题,从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