使用QPainter在QML前端上显示来自摄像机供稿的帧的替代方法

时间:2018-10-18 04:22:52

标签: c++ qt qml

以下是用于在前端显示框架的方法:

从QRunnable函数内的cv :: VideoCapture对象中抓取帧

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%的CPU(i7 6700 @ 3.40 Ghz)。由于视频分析也在后端运行,因此仅显示框架的成本太高。有这种方法的替代方法吗?

0 个答案:

没有答案