在Mac系统上使用Qt调用摄像头不出图解决方法
需求:在Mac系统上,调用摄像头,实现旋转、缩放、处理视频帧等功能
问题:使用获取视频帧的方法,在Mac上调不起来摄像头
解决方法:
将视频窗口(QVideoWidget)和视频帧(QVideoFrame)两种方法都用上
QVideoWidget的作用是,让Qt可以启动摄像头
QVideoFrame的作用是,让Qt可以处理视频帧
主要的图像显示与操作还是用的QVideoFrame
auto cameras = QCameraInfo::availableCameras(); QCamera *dev = new QCamera(cameras.at(1)); QVideoProbe *video = new QVideoProbe; if (video != nullptr) { video->setSource(dev); connect(video, SIGNAL(videoFrameProbed(QVideoFrame)), this, SLOT(slotOnProbeFrame(QVideoFrame)), Qt::QueuedConnection); } // 使用QVideoWidget启动摄像头,但是图像现实还是使用QVideoFrame来实现 QVideoWidget *view = new QVideoWidget; dev->setViewfinder(view); dev->setCaptureMode(QCamera::CaptureViewfinder); // 设置捕捉模式为视频,CaptureViewfinder,CaptureVideo,CaptureStillImage dev->load(); QCameraViewfinderSettings set = dev->viewfinderSettings(); set.setResolution(QSize(640,480)); set.setMinimumFrameRate(15); set.setPixelFormat(QVideoFrame::Format_Jpeg); dev->setViewfinderSettings(set); dev->start(); /* 旧版本代码,太复杂,麻烦了 auto cameras = QCameraInfo::availableCameras(); QCamera *dev = new QCamera(cameras.at(1)); QVideoProbe *video = new QVideoProbe; if (video != nullptr) { video->setSource(dev); connect(video,SIGNAL(videoFrameProbed(QVideoFrame)), this, SLOT(slotOnProbedFrame(QVideoFrame))); //connect(video, &QVideoProbe::videoFrameProbed, this, &MainWindow::slotOnProbedFrame); } QVideoWidget *view = new QVideoWidget(ui->widget); view->setFixedSize(ui->widget->width(),ui->widget->height()); dev->setViewfinder(view); dev->setCaptureMode(QCamera::CaptureViewfinder); dev->load(); QCameraViewfinderSettings set; set.setResolution(QSize(640,480)); set.setMinimumFrameRate(15); set.setPixelFormat(QVideoFrame::Format_Jpeg); dev->setViewfinderSettings(set); dev->start(); ui->widget->setUpdatesEnabled(false); */