QT и OpenCV проблема просмотра Opencv Mat на QGraphicsView в другом потоке :: QObject :: killTimer: Таймеры не могут быть остановлены из другого потока - PullRequest
0 голосов
/ 06 апреля 2020

Я разрабатываю QT GUI для проекта OpenCV и пытаюсь отобразить кадр обработки типа Mat в QGraphicsView. Я использую рабочий класс для обработки каждого кадра, захваченного камерой, затем развертываю класс в потоке, отделенном от процесса главного окна. Работа системы защищена, но в консоли она выдает мне эту ошибку при обработке кадров камеры: QObject :: killTimer: Таймеры нельзя остановить из другого потока .

Ниже приведен код рабочего и главного окна с управлением потоками:

ProcessingFrameWorker.hpp

public: 

    ProcessingImageWorker();
    ProcessingImageWorker(QGraphicsView * _showCameraFrame, 
        string _cameraRtsp);


    void process(); 

    Mat fameToShow;
    QGraphicsView * showCameraFrame;
    QGraphicsScene * scene; 
    QImage * imageToShow;

ProcessingFrameWorker. cpp

ProcessingImageWorker::ProcessingImageWorker(QGraphicsView * _showCameraFrame, 
    string _cameraRtsp)
    {
        showCameraFrame = _showCameraFrame;
    cameraRtsp = _cameraRtsp;
    isOpen = false;

    scene = new QGraphicsScene(this); 
    showCameraFrame->setScene(new QGraphicsScene(this));

    showCameraFrame->moveToThread(this->thread()); 
}

void ProcessingImageWorker::process() {

mainCap = VideoCapture(cameraRtsp); 

if (mainCap.isOpened())
{
    isOpen = true; 

    while (isOpen)
    {
        mainCap >> frameToShow; 

        cv::resize(frameToShow, frameToShow, cv::Size(showCameraFrame->width(), showCameraFrame->height()));
        imageToShow = new QImage(frameToShow.data, frameToShow.cols, frameToShow.rows, frameToShow.step, QImage::Format_RGB888);
        scene->addPixmap(QPixmap::fromImage(imageToShow)); 

        showCameraFrame->fitInView(scene->sceneRect());

        showCameraFrame->show(); 

    }   

}

}

MainWindow. cpp

QThread * processingFrameThread = new QThread(); 
ProcessingFrameWorker *processingFrameWorker = new ProcessingFrameWorker(ui->graphicsView, cameraRtsp);
processingFrameWorker->moveToThread(processingFrameThread);
processingFrameThread->start(); 
connect(processingFrameThread, SIGNAL(started()), processingFrameWorker, SLOT(process()));

Я заметил, что после нескольких итераций сообщение консоли исчезает.

Спасибо.

1 Ответ

0 голосов
/ 07 апреля 2020

Я решил эту проблему, передав сигнал QImage из потока обработки в класс главного окна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...