Qt6下的相机使用

原文地址

原文链接

前言

Qt6相对Qt5的接口变化非常大,很多Qt5的网络信息已经不适用了,需要自己去官方文档和官方示例项目里面慢慢摸索,相机方面的改动也是非常大,这里简单说下使用Qt6相机的两个方法

使用QVideoWidget

在官方的相机示例项目中,使用的是QVideoWidget作为相机的输出源,核心代码如下

//h
class Camera : public QWidget
{
    //...
    QScopedPointer<QCamera>     m_camera;
    QMediaCaptureSession        m_captureSession;
    QVideoWidget*               m_view;
    //...
}
//cpp
Camera::Camera(QWidget* parent) : QWidget{ parent }
{
    //...
    m_view = new QVideoWidget(this);
    m_view->resize(1920, 1080);
    const QList<QCameraDevice> cameras = QMediaDevices::videoInputs();
    if (!cameras.isEmpty()) {
        auto thisCamera = new QCamera(cameras.first());
        m_camera.reset(thisCamera);
        m_captureSession.setCamera(m_camera.data());
        m_captureSession.setVideoOutput(m_view)
    }
    //...
}
//
void Camera::startPlay()
{
    camera->startPlay();
}

作为官方推荐的,这个东西相当难用,可能是我没找对方法,但是方法不能被容易的发现也是难用。首先最重要的,它的播放模式是contain,所以如果在比例不对的情况下会有黑边,我没有找到如何切换它的播放模式改变为cover

那么我们就寻思自己去覆盖,使用resizeEvent和负起始坐标手动改为cover,结果还是不行。因为QVideoWidget上播放的东西z轴优先级是最高,无法通过负起始坐标来手动cover,因为它甚至可以突破父组件的限制到兄弟组件的位置去。故始终没有在Qt6下找到合适简单的方法可以以QVideoWidget完成cover播放,最后选择使用QGraphicsVideoItem完成播放。但是如果你不介意播放模式是contain,或者就想要这样的,那么QVideoWidget应该是更好的选择,根据文档的说法,它的性能会更高

使用QGraphicsVideoItem

核心代码如下

//h
class Wid : public QWidget
{
    //...
    private:
    QScopedPointer<QCamera> m_camera;
    QMediaCaptureSession    m_captureSession;
    QGraphicsVideoItem*     m_graphicsVideoItem;
    QGraphicsView*          m_cameraView;
    QGraphicsScene*         m_cameraScene;
    //...
}
//cpp
Camera::Camera(QWidget* parent) : QWidget{ parent }
{
    initLayout();
    initCamera();
    //..
}
//...
void Camera::initLayout()
{
    QVBoxLayout* mainLayout = new QVBoxLayout(this);
    mainLayout->setSpacing(0);
    mainLayout->setContentsMargins(0, 0, 0, 0);
    m_cameraScene = new QGraphicsScene();
    m_cameraView  = new QGraphicsView(m_cameraScene);
    m_cameraView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    m_cameraView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    m_cameraView->setScene(m_cameraScene);
    mainLayout->addWidget(m_cameraView);
    m_graphicsVideoItem = new QGraphicsVideoItem();
    //    m_graphicsVideoItem->setSize(QSizeF(865, 487));
    m_captureSession.setVideoOutput(m_graphicsVideoItem);
    m_cameraScene->addItem(m_graphicsVideoItem);
}

void Wid::initCamera()
{
    const QList<QCameraDevice> cameras = QMediaDevices::videoInputs();
    if (cameras.isEmpty())
    {
        // todo throw
    }
    auto thisCamera = new QCamera(cameras.first());
    m_camera.reset(thisCamera);
    m_captureSession.setCamera(m_camera.data());
}
//...

原文地址

原文链接

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为AI语言模型,我无法直接使用相机,但我可以提供一些帮助和建议。 如果你想在QT应用程序中使用Windows照相机,可以使用Windows Media Foundation库。它可以访问摄像头,并捕获视频流。 以下是一个简单的示例代码: ```c++ #include <QMainWindow> #include <QCamera> #include <QCameraViewfinder> #include <QCameraImageCapture> #include <QVBoxLayout> #include <QPushButton> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) , m_camera(new QCamera(this)) , m_viewfinder(new QCameraViewfinder(this)) , m_imageCapture(new QCameraImageCapture(m_camera, this)) , m_layout(new QVBoxLayout) , m_captureButton(new QPushButton(tr("Capture"), this)) { m_layout->addWidget(m_viewfinder); m_layout->addWidget(m_captureButton); QWidget *widget = new QWidget(this); widget->setLayout(m_layout); setCentralWidget(widget); m_camera->setViewfinder(m_viewfinder); m_camera->start(); connect(m_captureButton, &QPushButton::clicked, this, &MainWindow::captureImage); connect(m_imageCapture, &QCameraImageCapture::imageCaptured, this, &MainWindow::imageCaptured); } public slots: void captureImage() { m_imageCapture->capture(); } void imageCaptured(int id, const QImage &image) { // do something with the captured image } private: QCamera *m_camera; QCameraViewfinder *m_viewfinder; QCameraImageCapture *m_imageCapture; QVBoxLayout *m_layout; QPushButton *m_captureButton; }; ``` 注意:您需要在项目文件中添加以下行: ```c++ QT += multimedia multimediawidgets ``` 这将使您能够使用QCamera和QCameraViewfinder。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值