当前位置: 首页 > news >正文

Qt实战:如何打开摄像头并实现视频的实时预览

文章目录

    • 一、在 pro 文件中添加模块
    • 二、代码实现

一、在 pro 文件中添加模块

在 Qt5 中,如果你要使用 QCamera、QCameraViewfinder、QCameraImageCapture 等类,需要在 pro 文件里添加 multimedia 模块。

QT  += multimedia multimediawidgets
  • multimedia:核心多媒体功能(QCamera、QCameraImageCapture)
  • multimediawidgets:视频显示控件(QCameraViewfinder、QVideoWidget)

检查包含头文件:

#include <QCamera>
#include <QCameraViewfinder>
#include <QCameraImageCapture>

二、代码实现

在 Qt5 里,使用的是 QCamera + QCameraViewfinder + QCameraImageCapture。

CameraWindow.h

#pragma once#include <QWidget>
#include <QCamera>
#include <QCameraViewfinder>
#include <QCameraImageCapture>
#include <QPushButton>
#include <QVBoxLayout>
#include <QLabel>class CameraWindow : public QWidget
{Q_OBJECT
public:explicit CameraWindow(QWidget *parent = nullptr);private slots:void onOpenCamera();void onCaptureImage();void onCloseCamera();void onImageCaptured(int id, const QImage &preview);private:QCamera *m_camera = nullptr;QCameraViewfinder *m_viewfinder = nullptr;QCameraImageCapture *m_imageCapture = nullptr;QPushButton *m_btnOpen;QPushButton *m_btnCapture;QPushButton *m_btnClose;QLabel *m_labelPhoto;
};

CameraWindow.cpp

#include "CameraWindow.h"
#include <QDebug>
#include <QDateTime>CameraWindow::CameraWindow(QWidget *parent) : QWidget(parent)
{setWindowTitle("Qt5 摄像头示例");resize(800, 600);// 预览控件m_viewfinder = new QCameraViewfinder(this);m_viewfinder->setMinimumSize(640, 480);// 按钮m_btnOpen = new QPushButton("打开摄像头");m_btnCapture = new QPushButton("拍照");m_btnClose = new QPushButton("关闭摄像头");// 拍照结果显示m_labelPhoto = new QLabel;m_labelPhoto->setFixedSize(200, 150);m_labelPhoto->setStyleSheet("border: 1px solid gray;");// 布局auto vLayout = new QVBoxLayout(this);vLayout->addWidget(m_viewfinder, 1);auto hLayout = new QHBoxLayout;hLayout->addWidget(m_btnOpen);hLayout->addWidget(m_btnCapture);hLayout->addWidget(m_btnClose);hLayout->addWidget(m_labelPhoto);vLayout->addLayout(hLayout);// 信号槽connect(m_btnOpen, &QPushButton::clicked, this, &CameraWindow::onOpenCamera);connect(m_btnCapture, &QPushButton::clicked, this, &CameraWindow::onCaptureImage);connect(m_btnClose, &QPushButton::clicked, this, &CameraWindow::onCloseCamera);
}void CameraWindow::onOpenCamera()
{if (m_camera) return; // 已经打开m_camera = new QCamera(this);m_camera->setViewfinder(m_viewfinder);m_imageCapture = new QCameraImageCapture(m_camera, this);connect(m_imageCapture, &QCameraImageCapture::imageCaptured,this, &CameraWindow::onImageCaptured);m_camera->start();qDebug() << "摄像头已打开";
}void CameraWindow::onCaptureImage()
{if (!m_imageCapture) return;QString filename = QString("photo_%1.jpg").arg(QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss"));m_imageCapture->capture(filename);qDebug() << "已拍照保存到:" << filename;
}void CameraWindow::onCloseCamera()
{if (m_camera) {m_camera->stop();delete m_camera;m_camera = nullptr;delete m_imageCapture;m_imageCapture = nullptr;qDebug() << "摄像头已关闭";}
}void CameraWindow::onImageCaptured(int, const QImage &preview)
{m_labelPhoto->setPixmap(QPixmap::fromImage(preview).scaled(m_labelPhoto->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
}

main.cpp

#include "CameraWindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);CameraWindow w;w.show();return a.exec();
}
http://www.dtcms.com/a/358461.html

相关文章:

  • 生成式 AI 重构内容生产:效率提升背后的创作版权边界争议
  • react虚拟列表实现及原理
  • leetcode2(移除元素)
  • 本地部署音效生成器 Moodist 并实现外部访问
  • Spring Cloud 和 Dubbo 是目前主流的两大微服务框架,分别代表了两种不同的技术路线
  • HarmonyOS 应用开发:基于API 12及以上的现代化实践
  • I2C多点触控驱动开发详解
  • Elasticsearch logsdb 索引模式和 TSDS 的业务影响
  • 【小白笔记】基本的Linux命令来查看服务器的CPU、内存、磁盘和系统信息
  • 网络编程4-并发服务器、阻塞与非阻塞IO、信号驱动模型、IO多路复用..
  • MQTT 连接建立与断开流程详解(二)
  • 项目管理在企业中的作用
  • 小迪Web自用笔记7
  • Redission 实现延迟队列
  • 鸿蒙NEXT布局全解析:从线性到瀑布流,构建自适应UI界面
  • Notepad++常用设置
  • 金仓数据库迁移评估系统(KDMS)V4正式上线,助力企业高效完成数据库国产化替代
  • 果蔬采摘机器人:自动驾驶融合视觉识别,精准定位,高效作业
  • 【SoC】【W800】基于W800的PWM实现
  • 类和反射的机制
  • hashmap计算key的hash的时候为什么要右移16位
  • 鸿蒙ArkTS 核心篇-16-循环渲染(组件)
  • Ruoyi-vue-plus-5.x第一篇Sa-Token权限认证体系深度解析:1.3 权限控制与注解使用
  • 【计算机组成原理】LRU计数器问题
  • Vue3 + GeoScene 地图点击事件系统设计
  • Selenium + PO 框架进阶实践:接入 Allure 报告与 Jenkins 持续集成
  • macOs上ffmpeg带入libx264库交叉编译
  • docker 启动一个clickhouse , docker 创建ck数据库
  • Python远程文件管理移动端适配与跨平台优化实战
  • vue3多个el-checkbox勾选框设置必选一个