晓py 2025-06-30 22:31 采纳率: 57.1%
浏览 29

qt摄像头捕捉问题,无法显示捕捉画面

mainwindow.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsVideoItem>
#include <QGraphicsTextItem>
#include <QCamera>
#include <QPushButton>
#include <ui_mainwindow.h>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void onButtonClicked();

private:
    void resizeEvent(QResizeEvent *event) override;
    Ui::MainWindow *ui;  // 声明 ui 指针
    QCamera *camera;
    QGraphicsScene *scene;
    QGraphicsView *view;
    QGraphicsVideoItem *videoItem;
    QGraphicsPixmapItem *pixmapItem;
    QGraphicsTextItem *textItem;
    QPushButton *changeTextBtn;
    int textCounter = 1;
};

#endif // MAINWINDOW_H

mainwindow.cpp文件

#include "mainwindow.h"
#include <QVBoxLayout>
#include <QResizeEvent>
#include <QCameraInfo>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    //使用Qt开发一个简单界面,将摄像头的视频流在界面中显示。
    //在视频流中叠加小图片和简单文字,如hello world,可以通过按钮改变叠加的内容 如从hello world 变为hello world 1。
    //功能需求
    // 1.初始化摄像头
    QList<QCameraInfo> cameras = QCameraInfo::availableCameras();
    if (cameras.isEmpty()) {
        qDebug() << "未找到摄像头!";
        return;
    }
    camera = new QCamera(cameras.first(), this);

    // 2.初始化视频渲染项
    videoItem = new QGraphicsVideoItem;
    camera->setViewfinder(videoItem);

    // 初始化场景和视图
    scene = new QGraphicsScene(this);
    view = new QGraphicsView(scene);
    scene->addItem(videoItem);

    // 3.添加叠加图片
    pixmapItem = new QGraphicsPixmapItem(QPixmap(":/1.jpg"));
    pixmapItem->setPos(20, 20);
    scene->addItem(pixmapItem);

    // 添加文字项
    textItem = new QGraphicsTextItem("Hello World");
    QFont font = textItem->font();
    font.setPointSize(24);
    font.setBold(true);
    textItem->setFont(font);
    textItem->setDefaultTextColor(Qt::white);
    textItem->setPos(20, 300);
    scene->addItem(textItem);

    // 添加按钮
    changeTextBtn = new QPushButton("更改文字为 Hello World 1", this);
    connect(changeTextBtn, &QPushButton::clicked, this, &MainWindow::onButtonClicked);

    // 布局设置
    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(view);
    mainLayout->addWidget(changeTextBtn);

    QWidget *centralWidget = new QWidget;
    centralWidget->setLayout(mainLayout);
    setCentralWidget(centralWidget);

    // 启动摄像头
    camera->start();
}

MainWindow::~MainWindow()
{
    camera->stop();
}

void MainWindow::onButtonClicked()
{
    //标记文本
    textCounter++;
    textCounter%=2;
    textItem->setPlainText(QString("Hello World %1").arg(textCounter));
    changeTextBtn->setText(QString("更改文字为 Hello World %1").arg(textCounter));
    // 文字居中
    QRectF textRect = textItem->boundingRect();
    textItem->setPos((view->viewport()->width() - textRect.width()) / 2,
                    (view->viewport()->height() - textRect.height()) / 2);
}

void MainWindow::resizeEvent(QResizeEvent *event)
{
    QMainWindow::resizeEvent(event);
    if (textItem && view) {
        QRectF textRect = textItem->boundingRect();
        textItem->setPos((view->viewport()->width() - textRect.width()) / 2,
                        (view->viewport()->height() - textRect.height()) / 2);
    }
}

为什么程序组后输出,捕捉的摄像头画面没有,摄像头是正确的

img

  • 写回答

6条回答 默认 最新

  • 阿里嘎多学长 2025-06-30 22:31
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    Qt 摄像头捕捉问题,无法显示捕捉画面

    你遇到的问题是 Qt 应用程序无法显示摄像头捕捉的画面。下面是一些可能的解决方案:

    1. 检查摄像头权限:确保你的应用程序有访问摄像头的权限。可以在 Qt 项目的 .pro 文件中添加以下代码:
    QT += multimedia
    
    1. 检查摄像头设备:使用 QCameraInfo 类来获取可用的摄像头设备。例如:
    QCameraInfo cameraInfo = QCameraInfo::availableCameras();
    if (cameraInfo.isEmpty()) {
        qDebug() << "No camera available";
        return;
    }
    
    1. 检查摄像头设置:确保摄像头的设置正确。例如,检查摄像头的分辨率、帧率和格式是否正确。
    2. 检查 UI 界面:确保 UI 界面正确地显示摄像头捕捉的画面。例如,检查 QLabel 的大小、位置和样式是否正确。

    以下是一个简单的示例代码,展示如何使用 Qt 捕捉摄像头:

    #include <QMainWindow>
    #include <QCamera>
    #include <QCameraViewfinder>
    #include <QLabel>
    
    class MainWindow : public QMainWindow {
    public:
        MainWindow() {
            QCamera *camera = new QCamera(this);
            QCameraViewfinder *viewfinder = new QCameraViewfinder(this);
            camera->setViewfinder(viewfinder);
            camera->setCaptureMode(QCamera::CaptureMode::VideoCapture);
            camera->start();
            QLabel *label = new QLabel(this);
            label->setPixmap(viewfinder->grabFrame());
            label->show();
        }
    };
    

    这个示例代码创建了一个摄像头对象,设置了摄像头的捕捉模式为视频捕捉,然后启动摄像头。最后,它创建了一个 QLabel 对象,显示摄像头捕捉的画面。

    如果你仍然无法解决问题,请提供更多的代码和错误信息,我将尽力帮助你解决问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月30日