Я разрабатываю 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()));
Я заметил, что после нескольких итераций сообщение консоли исчезает.
Спасибо.