Ниже приведен метод, используемый для отображения кадра во внешнем интерфейсе:
Кадр извлекается из объекта 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 ГГц).С видеоаналитикой, также запущенной в бэкэнде, это слишком дорого для простого отображения кадра.Есть ли альтернатива этому методу?