我開發了一個應用程序,使用Qt Creator 2.4.1(Qt 4.8.4)和OpenCV 2.4.2從文件夾讀取圖像並顯示它們。使用opencv的內存泄漏:VideoCapture
它使用cv :: VideoCapture和QGraphicsScene/QGraphicsView。它運行良好,但是我遇到內存泄漏:如果我查看任務管理器中消耗的內存,每當讀取新映像並最終崩潰時,內存都會上升。
我的主窗口是用Qt Designer創建的,它是一個繼承QMainWindow的類。有就可以了QGraphicsView view_src
,也是一個按鈕:buttonStart
這裏是代碼示例:類聲明:
using namespace std;
using namespace cv;
namespace Ui {
class FenetrePrinc;
}
class FenetrePrinc : public QMainWindow {
Q_OBJECT
public:
explicit FenetrePrinc(QWidget *parent = 0);
~FenetrePrinc();
public slots:
virtual void start();
virtual void tick();
virtual void stop_timer();
private:
Ui::FenetrePrinc *ui;
QString filename;
QGraphicsScene *scene_src;
QGraphicsItem *img_src;
VideoCapture sequence;
Mat src;
};
類定義:
FenetrePrinc::FenetrePrinc(QWidget *parent) : QMainWindow(parent), ui(new Ui::FenetrePrinc){
ui->setupUi(this);
scene_src = new QGraphicsScene();
timer = new QTimer(this);
img_src = scene_src->addPixmap(QPixmap("vide.jpg"));
ui->view_src->setScene(scene_src);
connect(ui->buttonStart, SIGNAL(clicked()), this, SLOT(start()));
}
FenetrePrinc::~FenetrePrinc(){
delete scene_src;
delete img_src;
delete ui;
}
void FenetrePrinc::start(){
if(src.empty())
sequence.open(filename.toStdString());
connect(timer, SIGNAL(timeout()), this, SLOT(tick()));
timer->start(1000/24); //24 frames per second
disconnect(ui->buttonStart, SIGNAL(clicked()), this, SLOT(start()));
connect(ui->buttonStart, SIGNAL(clicked()), this, SLOT(stop_timer()));
}
void FenetrePrinc::tick(){
sequence >> src;
if(src.empty())
{
sequence.release();
stop_timer();
return;
}
scene_src->removeItem(img_src);
img_src = scene_src->addPixmap(convert16uc1(src));
src.release();
}
void FenetrePrinc::stop_timer(){
timer->stop();
disconnect(timer, SIGNAL(timeout()), this, SLOT(tick()));
disconnect(ui->buttonStart, SIGNAL(clicked()), this, SLOT(stop_timer()));
connect(ui->buttonStart, SIGNAL(clicked()), this, SLOT(start()));
}
我不明白爲什麼每次讀取圖像時,內存使用情況都會變得越來越高,我每次讀取圖像時都會釋放圖像,並在完成後釋放序列。但也許我錯過了什麼?
編輯:函數QPixmap convert16uc1(Mat img)
是內存泄漏的原因。我必須使用這個函數,因爲我正在處理Qt無法讀取的16位灰度圖像。我打開圖像並使用OpenCV執行圖像處理,並使用Qt顯示圖像。
函數的代碼如下:
QPixmap FenetrePrinc::convert16uc1(const cv::Mat& source)
{
quint16* pSource = (quint16*) source.data;
int pixelCounts = source.cols * source.rows;
QImage dest(source.cols, source.rows, QImage::Format_RGB32);
char* pDest = (char*) dest.bits();
for (int i = 0; i < pixelCounts; i++)
{
quint8 value = (quint8) ((*(pSource)) >> 8);
*(pDest++) = value; // B
*(pDest++) = value; // G
*(pDest++) = value; // R
*(pDest++) = 0; // Alpha
pSource++;
}
return QPixmap::fromImage(dest);
}
請與最近的OpenCV的版本,2.4試試。2太老 – berak
如果你不顯示的圖像與Qt(只讀圖像,不顯示),它是否泄漏內存呢? – Micka
@Micka:如果我不顯示圖像,即使我沒有通過src.release()釋放圖像也沒有內存泄漏;產生內存泄漏的行是:img_src = scene_src.addPixmap (convert16uc1(src));' – zarachbaal