Ошибка сегментации в связи между потоками сигнала/слота Qt

Я включил OpenCV в свой проект Qt для обнаружения частей в видео. У меня есть отдельный поток, который перебирает каждый кадр. Для отладки вывода я конвертирую Mat в QImage и отправляю ссылку в основной поток, где изображение отображается в виде QLabel.

Функция Init, которая также запускает поток для возврата первого кадра.

void KeyDetectorThread::init(QString videoPath)
{
    capture = new VideoCapture(videoPath.toStdString());

    initiated = true;

    if (!isRunning())
    {
        start(LowPriority);
    }
}

Поток приостанавливается на каждой итерации для анализа каждого кадра, за исключением случаев, когда pauseIteration == false

void KeyDetectorThread::run()
{
    Mat frame;
    //while (capture->grab())
    for(int i = 0; i < 10; ++i)
    {
        qDebug() << i;

        capture->read(frame);
        QImage *img = new QImage((uchar*) frame.data, frame.cols, frame.rows, frame.step, QImage::Format_RGB888);
        emit imageChanged(img);

        mutex.lock();
        if (pauseIteration)
            condition.wait(&mutex);
        mutex.unlock();
    }
}

Слот в основном потоке:

void MainWindow::setVideoImage(QImage *image)
{
    qDebug() << curVideoImg << " | " << image;

    if (curVideoImg != nullptr)
    {
        // free memory for old image
        delete curVideoImg;
    }

    curVideoImg = image;

    QPixmap pm = QPixmap::fromImage(*curVideoImg);
    int w = ui->imageOutput->width ();
    int h = ui->imageOutput->height ();
    ui->imageOutput->setPixmap (pm.scaled (w,h,Qt::KeepAspectRatio));
}

Я получаю ошибку сегментации в строке QPixmap pm = QPixmap::fromImage(*curVideoImg);, когда итерация в потоке завершена. Я думал, так как я передаю указатель на сигнал, этого не должно происходить. Странно, что эта ошибка возникает не постоянно. Я еще не нашел закономерности, когда это происходит.


person link    schedule 03.09.2020    source источник
comment
Данные frame.data должны оставаться действительными в течение всего срока службы QImage.   -  person B0FEE664    schedule 03.09.2020