gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:10:01 30 4
gpt4 key购买 nike

我对从 cvQueryFrame 返回的 IplImage* 有问题...它的内存永远不会被库释放。文档说:

The returned image should not be released or modified by the user.

好吧……我该如何找回我的内存?该程序会消耗内存直到崩溃。我想在帧处理完成后为每个 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:
};

实现:

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();
}

最佳答案

据我测试,Linux 的 v2.3.1 没有泄漏。

事情是这样的:当第一次调用此函数时,cvQueryFrame() 会分配一个图像,然后在所有对 cvQueryFrame() 的后续调用中重新使用该图像。第一次调用后没有创建新图像,图像仅在 cvReleaseCapture() 中释放。

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

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

关于c++ - OpenCV 函数中的内存泄漏 : cvQueryFrame(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9382262/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com