【问题标题】:QT and OpenCV problem viewing Opencv Mat on QGraphicsView in different thread :: QObject::killTimer: Timers cannot be stopped from another threadQT 和 OpenCV 问题在不同线程中的 QGraphicsView 上查看 Opencv Mat :: QObject::killTimer: 计时器不能从另一个线程停止
【发布时间】:2020-07-18 13:19:29
【问题描述】:

我正在为 OpenCV 项目开发 QT GUI,并且正在尝试在 QGraphicsView 上显示 Mat 类型的处理框架。我正在使用一个工作类来处理相机捕获的每一帧,然后将该类部署在与主窗口进程分开的线程中。系统工作得到保护,但在控制台中,它在处理相机的帧时给了我这个错误:QObject::killTimer: 计时器不能从另一个线程停止

下面是关于worker和线程管理主窗口的代码:

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()));

我注意到,经过几次迭代,控制台消息消失了。

谢谢。

【问题讨论】:

  • 除了运行main 的线程之外,您不能从任何线程读取/写入Qt GUI 元素。不支持。

标签: c++ qt opencv user-interface computer-vision


【解决方案1】:

我已经通过从处理线程到主窗口类的 QImage 信号解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多