QT实时摄像机显示由于内存不足而崩溃

问题描述

我正在使用QT Qpixmap显示使用OpenCV帧从相机捕获的图像。我正在按照以下步骤操作

  1. 使用OpenCV捕获图像
  2. 将OpenCV图像转换为QImage
  3. 将QImage转换为Qpixmap
  4. 在Qlabel上显示

我面临的问题是内存开始高速增长,并且过了几次应用程序因内存不足而崩溃

我已经遍历了几次代码,一次又一次地检查正在创建的任何对象。

示例代码如下

void mainfucntion(){
std::thread producer_t(&MainWindow::RunDefaultCamera,this);

for(;;){

        time(&start);
        timer = double(getTickCount());
        tic();

        if(!bufferQueue.empty()){
          lock_guard<std::mutex> lock(fmutex);
            readFrame = bufferQueue.front();
            qDebug() << "1 : " << bufferQueue.size();
            bufferQueue.pop_front();
            qDebug() << "2 : " << bufferQueue.size();
        }
        else{
            if(keepRunning == true)
            {
                if(threadEnable==false)
                {
                   std::thread producer_t(&MainWindow::RunDefaultCamera,this);
                }
                continue;
            }
            else{
                producer_t.join();
                return -1;
            }
        }
// cap >> readFrame;
cv::resize(readFrame,readFrame,size);

img = QImage((uchar*) readFrame.data,readFrame.cols,readFrame.rows,readFrame.step,QImage::Format_BGR888);
image = Qpixmap::fromImage(img);
// Qpixmap image = Qpixmap(img);

        ui->lbldisplayVideo->setpixmap(image);
}

线程功能在这里

void runthread()
{
while(capture.isOpened())
{

        qDebug() << "thread is running";
        capture >> ImageMat;
        bufferQueue.push_back(ImageMat);
        
        if(!ImageMat.empty())
        {
            frameCounter++;

            lock_guard<std::mutex> lock(fmutex);
            if (int(bufferQueue.size()) >= bufferSize)
            {
                bufferQueue.clear();
            }
            else
            {
                bufferQueue.push_back(ImageMat);
             }

        }
        sleep(100);
//        ui->listInfo->addItem(QString::number(bufferQueue.size()));
        qDebug() << bufferQueue.size();
}
capture.release();
}

任何帮助将不胜感激。

解决方法

在尝试了许多事情之后,得出了结论,代码现在可以正常工作了

我删除了tic toc部分

time(&start);
timer = double(getTickCount());
tic();

它正在工作,但是崩溃了,只是为了确保QImage不是NULL,我删除了img = QImage(); // releasing memory

使用

if(!img.isNull())
    img = QImage();

现在工作正常。

共享编辑未删除标志