【问题标题】:QT live camera showing crashes due to out of memoryQT 实时摄像头显示因内存不足而崩溃
【发布时间】:2020-12-03 11:08:28
【问题描述】:

我正在使用 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();
}

任何帮助将不胜感激。

【问题讨论】:

标签: c++ qt opencv qpixmap


【解决方案1】:

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

我删除了tic toc部分

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

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

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

它现在工作得很好。

分享编辑取消删除标志

【讨论】:

    猜你喜欢
    • 2020-12-03
    • 2022-01-08
    • 2013-04-18
    • 2014-03-29
    • 1970-01-01
    • 2013-05-24
    • 2011-03-28
    • 1970-01-01
    相关资源
    最近更新 更多