我遇到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();
}
答案 0 :(得分:1)
就我的测试而言,Linux的v2.3.1中没有泄漏。
以下是发生的情况:第一次调用此函数时,cvQueryFrame()
分配图像,然后在cvQueryFrame()
的所有后续调用中重复使用此图像。第一次调用后不会创建新图像,图像仅在cvReleaseCapture()
处释放。
所以你看,如果你遇到内存泄漏(你是怎么发现的,确切地说?)和崩溃,很可能是由代码的其他部分引起的。如果sendImage()
未同步(即非阻塞),则直接传递main
图像可能会导致问题。我不知道你在这个函数中做了什么,所以我认为问题在于它内部。
您可以执行的一项测试是复制main
框架,然后将该副本传递给sendImage()
,然后在您不再需要时将其释放。