Я включил 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);
, когда итерация в потоке завершена. Я думал, так как я передаю указатель на сигнал, этого не должно происходить. Странно, что эта ошибка возникает не постоянно. Я еще не нашел закономерности, когда это происходит.