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

标签 c++ qt opencv qpixmap

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

  • 使用OpenCV捕获图像
  • 将OpenCV图像转换为QImage
  • 将QImage转换为Qpixmap
  • 在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不为空,我删除了img = QImage(); // releasing memory
    if(!img.isNull())
        img = QImage();
    
    现在工作正常。
    共享编辑取消删除标志

    关于c++ - QT实时摄像机显示由于内存不足而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63397902/

    相关文章:

    c++ - 奥斯卡自拍中的眼睛检测

    python - 类型错误 : Scalar value for argument 'color' is not numeric in openCV

    c++ - 从函数返回后调用的析构函数

    c++ - "still reachable"和 "possibly lost" block 的 C++ 中的 valgrind 输出不引用我的来源

    c++ - 如何使用 QDataStream 从文件中读取二进制数据?

    excel - 使用不同的 Excel 文件绘制图形

    qt - QWidget 调整大小信号?

    c++ - 逻辑 : B contained by set A 的模板和 C++ 运算符

    java - 在 64-Win 7 上的 32 位 JVM 中读取 C++ 中的 JNI-ByteBuffer 时发生访问冲突

    c++ - 如何让 linux 系统等待 OpenCV 程序?