Альтернативный метод использования QPainter для отображения кадров с канала камеры на веб-интерфейсе QML
Ниже приведен метод, используемый для отображения рамки на веб-интерфейсе:
Фрейм извлекается из объекта cv::VideoCapture внутри функции QRunnable
void CameraFeedGrabber::run()
{
while(mStopCapture)
{
cv::Mat mat;
bool isFrameGrabbed = cap->read(mat);// gets the next frame
if(isFrameGrabbed )
{
emit frameAvailable(mViewId,mat.clone());
}+;
}
}
Сигнал передается из вышеуказанного класса в интерфейс связи
void QmlInterface::processFrames(int cameraId, cv::Mat mat, bool sessionStatus)
{
if(GlobalSettings::mQmlVideoIntList.size() > 0)
{
cv::Mat matToSend = mat.clone();
cv::cvtColor(matToSend, matToSend, cv::COLOR_BGR2RGB);
QImage qFrame1 = QImage((uchar*)matToSend.data, matToSend.cols, matToSend.rows, matToSend.step, QImage::Format_RGB888);
GlobalSettings::mQmlVideoIntList[0]->setFrame(qFrame1);
}
if(sessionStatus)
mFrameAssigner->setFrame(mat);
}
Интерфейсный интерфейс вызывает функцию внутри класса отображения для обновления кадра
QmlVideoInterface::QmlVideoInterface(QQuickItem *parent):
QQuickPaintedItem(parent)
{
}
void QmlVideoInterface::paint(QPainter *painter)
{
painter->drawImage(0, 0, mCurrentImage.scaled(_imageWidth, _imageHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
}
void QmlVideoInterface::setFrame(const QImage &image)
{
mutex.lock();
mCurrentImage = image.copy();
update();
mutex.unlock();
}
Использование этого метода прекрасно работает при отображении небольших кадров, но для больших кадров, например, 1920*1080 использует около 20% ЦП (i7 6700 при 3,40 ГГц). С видеоаналитикой, также запущенной в бэкэнде, это слишком дорого для простого отображения кадра. Есть ли альтернатива этому методу?