gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:28:16 25 4
gpt4 key购买 nike

我正在使用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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com