以下是用于在前端显示框架的方法:
从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)。由于视频分析也在后端运行,因此仅显示框架的成本太高。有这种方法的替代方法吗?