在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);
*/

 

posted @ 2023-05-10 14:02  十一的杂文录  阅读(182)  评论(0编辑  收藏  举报