我正在尝试使用从QQuickPaintedItem继承的类来显示使用openCV捕获的视频帧。

在此类中,有一个名为queryFrame()的插槽,该插槽通过以下方式连接到QTimer timout(40ms):

connect(m_timer, SIGNAL(timeout()), this, SLOT(queryFrame()));

queryFrame()代码:
void CVCamScreen::queryFrame()
{
    if(!m_url.isEmpty()){
        if( !m_capture->isOpened() ) {
            m_capture->open( m_url.toStdString() );
        }

        cv::Mat frame;
        m_capture->read( frame );

        m_qImage = ipl2Qimg(new IplImage(frame));

        update();

        emit frameChanged();
    }
}

每次调用queryFrame()时,都应更新 View 。它正在执行此操作,但是不能异步工作。

我应该如何以独立的方式自行更新每个CVCamScreen?

呈现CamScreens的QML代码:
Repeater {
    model: 8

    CVCamScreen {
        Layout.fillWidth: true
        Layout.fillHeight: true

        url: Controller.urlCanal(index + 1)

        CustomBorder {
            commonBorder: true
            color: "#228e14"
            commonBorderWidth: 3
        }

        onUrlChanged: {
            start(); // starts the timer when the URL changes.
        }
    }
}

最佳答案

您的问题是所有CVCamScreen对象都在同一线程中。因此,定时器事件按顺序传递给它们。我建议将实际读取的内容从设备和ipl2Qimg()放到一个后台线程中,该线程将在数据准备好并应调用CVCamScreen时通知update()

07-28 03:00