Я пытаюсь использовать класс, который наследуется от QQuickPaintedItem, для отображения видеокадров, снятых с помощью openCV.
в этом классе есть слот под названием queryFrame (), который связан с тайм-аутом QTimer (40 мс):
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 (), он должен обновлять представление. Он делает это, но не работает асинхронно.
Как я должен сделать каждое из этих обновлений CVCamScreen самостоятельно самостоятельно?
QML-код, который отображает CamScreens:
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()
должен быть назван.