OpenCV函数中的内存泄漏:cvQueryFrame()

时间:2012-02-21 17:33:29

标签: c++ memory-management memory-leaks opencv

我遇到IplImage*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
}

更新 这是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();
}

主要():

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

1 个答案:

答案 0 :(得分:1)

就我的测试而言,Linux的v2.3.1中没有泄漏。

以下是发生的情况:第一次调用此函数时,cvQueryFrame()分配图像,然后在cvQueryFrame()的所有后续调用中重复使用此图像。第一次调用后不会创建新图像,图像仅在cvReleaseCapture()处释放。

所以你看,如果你遇到内存泄漏(你是怎么发现的,确切地说?)和崩溃,很可能是由代码的其他部分引起的。如果sendImage()未同步(即非阻塞),则直接传递main图像可能会导致问题。我不知道你在这个函数中做了什么,所以我认为问题在于它内部。

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