前言:
终于要来点干货了,本次教程会取出视频帧,笔者使用的是Qt5.15.2
在Qt5.15.2(widget)摄像头显示示例的基础上修改
一、修改UI显示
如下所示,是笔者修改的UI
二、增加取帧的处理类
新建一个类Tool_VideoFrames,在类内部,实例化QVideoProbe,并设置源
关键代码如下
//实例化QVideoProbe
m_probe = new QVideoProbe;
//为QVideoProbe设置摄像头
m_probe->setSource( camera );
//通过videoFrameProbed()信号,可以取出摄像头的原始帧
connect( m_probe, &QVideoProbe::videoFrameProbed,
this, &Tool_VideoFrames::onProcssFrame );
void Tool_VideoFrames::onProcssFrame(const QVideoFrame &frame)
{
// qDebug()<<frame;
const QImage image = frame.image();
emit newVideoFrame(image);
}
三、主函数中初始化,并调用
关键代码如下
//初始化摄像头
m_camera = new QCamera(QCameraInfo::defaultCamera());
connect(m_camera, &QCamera::errorOccurred, [this](){
qDebug()<< "camera error occurred"<<this->m_camera->errorString();
});
m_camera->setViewfinder(ui->videoWidget);
// qDebug()<<m_camera->cameraDevice();
//初始化取摄像头帧的类
m_tool_VideoFrames = new Tool_VideoFrames;
m_tool_VideoFrames->setCamera(m_camera);
connect(m_tool_VideoFrames, &Tool_VideoFrames::newVideoFrame,
[this](const QImage videoFrame){
ui->label->setPixmap(QPixmap::fromImage(videoFrame.scaled(ui->label->size(),Qt::KeepAspectRatio)));
});
程序运行如下
大功告成
本教程示例源码
后记:
第一次取视频帧成功,只使用Qt的库,看起来不错。有细心的小伙伴已经注意了,怎么预览画面与取出的帧不太一样?没错,可能是一样的,但若换个摄像头,取出的帧就可能发生倒置或镜像。若使用的摄像头是确定的,这没问题,但无法做成通用程序。
下一往篇,继续讲解处理方法