一、所需外部模块
需要包含多媒体模块
QT+=multimedia multimediawidgets
multimedia:QCamera
multimediawidgets:QVideoWidget,QCameraViewfinder
二、类
QCamera类:
QCamera类为系统摄像头设备提供接口。
QCamera可以与QCameraViewfinder一起使用,用于取景器显示,QMediaRecorder用于视频录制,QCameraImageCapture用于图像拍摄。
QVideoWidget类:
QVideoWidget类提供了一个小部件,用于呈现由媒体对象生成的视频。
QCameraViewfinder类:
QCameraViewfinder类提供了一个相机取景器小部件。
三、使用
1、遍历可用设备
foreach (const QCameraInfo &cameraInfo, QCameraInfo::availableCameras()) {
//人能读懂的设备名字
qDebug()<< cameraInfo.description();
//返回相机的设备名称
//比如:@device:pnp:\\\\?\\usb#vid_13d3&pid_56db&mi_00#8&31a7812a&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\\global
qDebug()<< cameraInfo.deviceName();
}
2、开启摄像头
①使用QVideoWidget作为显示窗口
QCamera *camera; //摄像头对象
camera = new QCamera(QCameraInfo::defaultCamera()); //设置为默认设备
camera->setViewfinder(ui->widget); //指定图像的输出窗口
camera->start(); //启动
在上面的ui->widget是在ui界面中拖入的一个widget控件,然后提升控件为QVideoWidget类型,当然也可以直接使用QVideoWidget定义对象来作为显示的窗口
②使用QCameraViewfinder作为显示窗口
QCamera *camera; //摄像头对象
camera = new QCamera(QCameraInfo::defaultCamera()); //设置为默认设备
QCameraViewfinder *viewFinder;
viewFinder=new QCameraViewfinder;
viewFinder->show();
camera->setViewfinder(viewFinder);
camera->start();
这个并没有提升控件,所以QCameraViewfinder会作为一个单独的窗口显示出来
③问题
在显示的时候,会出现以下情况
问题区域的问题是在显示的时候会显示图像的上半部分,但是只会显示一次,然后就不再更新,或者说显示的区域是0~10,正常显示的部分是2~10,0~2这部分就只显示一次,然后就不在更新,除非显示窗口发生重绘事件。
我的解决方案是写一个计时器,然后响应计时器的消息,在槽函数中调用显示窗口的update成员,产生绘制事件来更新窗口