Qt处理Windows平板上摄像头

news/2025/10/4 17:27:24/文章来源:https://www.cnblogs.com/ljbguanli/p/19125770

Qt处理Windows平板上摄像头

方案一:使用QCamera

项目配置(pro文件)

qmake

QT += multimedia multimediawidgets
# 如果需要使用QML
QT += qml quick
# Windows平台可能需要
win32: LIBS += -lole32

1. 完整摄像头控制类

cpp

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include class AdvancedCameraWindow : public QWidget
{Q_OBJECTpublic:AdvancedCameraWindow(QWidget *parent = nullptr) : QWidget(parent){setupUI();refreshCameraList();setupConnections();}private slots:void refreshCameraList(){m_cameraCombo->clear();QList cameras = QCameraInfo::availableCameras();for (const QCameraInfo &cameraInfo : cameras) {QString cameraName = cameraInfo.description();// 判断摄像头类型if (cameraInfo.position() == QCamera::FrontFace) {cameraName += " (前置)";} else if (cameraInfo.position() == QCamera::BackFace) {cameraName += " (后置)";}m_cameraCombo->addItem(cameraName, QVariant::fromValue(cameraInfo));}}void switchCamera(int index){if (m_camera && m_camera->status() == QCamera::ActiveStatus) {m_camera->stop();}if (index >= 0) {QCameraInfo cameraInfo = m_cameraCombo->itemData(index).value();m_camera = new QCamera(cameraInfo, this);setupCamera();m_camera->start();updateCameraCapabilities();}}void toggleTorch(bool enabled){if (!m_camera || !m_flashControl) return;if (enabled) {m_flashControl->setFlashMode(QCameraExposure::FlashTorch);} else {m_flashControl->setFlashMode(QCameraExposure::FlashOff);}}void toggleCamera(bool start){if (start) {if (m_camera) {m_camera->start();}} else {if (m_camera) {m_camera->stop();}}}void setZoom(int value){if (m_focus) {m_focus->zoomTo(value, value);}}void setExposureCompensation(int value){if (m_exposure) {m_exposure->setExposureCompensation(value / 10.0);}}void captureImage(){if (m_imageCapture && m_imageCapture->isReadyForCapture()) {QString filename = QString("capture_%1.jpg").arg(QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss"));m_imageCapture->capture(filename);}}void imageCaptured(int id, const QImage &preview){Q_UNUSED(id)preview.save("latest_capture.jpg");}private:void setupUI(){QVBoxLayout *mainLayout = new QVBoxLayout(this);// 摄像头选择区域QGroupBox *cameraGroup = new QGroupBox("摄像头设置", this);QHBoxLayout *cameraLayout = new QHBoxLayout(cameraGroup);cameraLayout->addWidget(new QLabel("选择摄像头:"));m_cameraCombo = new QComboBox(this);cameraLayout->addWidget(m_cameraCombo);QPushButton *refreshBtn = new QPushButton("刷新列表", this);cameraLayout->addWidget(refreshBtn);mainLayout->addWidget(cameraGroup);// 视频显示区域m_viewfinder = new QCameraViewfinder(this);m_viewfinder->setMinimumSize(640, 480);mainLayout->addWidget(m_viewfinder);// 控制按钮区域QGroupBox *controlGroup = new QGroupBox("摄像头控制", this);QGridLayout *controlLayout = new QGridLayout(controlGroup);// 闪光灯控制m_torchCheck = new QCheckBox("开启闪光灯/手电筒", this);controlLayout->addWidget(m_torchCheck, 0, 0, 1, 2);// 变焦控制controlLayout->addWidget(new QLabel("变焦:"), 1, 0);m_zoomSlider = new QSlider(Qt::Horizontal, this);m_zoomSlider->setRange(1, 10);m_zoomSlider->setValue(1);controlLayout->addWidget(m_zoomSlider, 1, 1);// 曝光补偿controlLayout->addWidget(new QLabel("曝光补偿:"), 2, 0);m_exposureSlider = new QSlider(Qt::Horizontal, this);m_exposureSlider->setRange(-20, 20);m_exposureSlider->setValue(0);controlLayout->addWidget(m_exposureSlider, 2, 1);mainLayout->addWidget(controlGroup);// 操作按钮QHBoxLayout *buttonLayout = new QHBoxLayout();m_startBtn = new QPushButton("开始", this);m_stopBtn = new QPushButton("停止", this);m_captureBtn = new QPushButton("拍照", this);buttonLayout->addWidget(m_startBtn);buttonLayout->addWidget(m_stopBtn);buttonLayout->addWidget(m_captureBtn);mainLayout->addLayout(buttonLayout);}void setupConnections(){connect(m_cameraCombo, QOverload::of(&QComboBox::currentIndexChanged),this, &AdvancedCameraWindow::switchCamera);connect(m_torchCheck, &QCheckBox::toggled,this, &AdvancedCameraWindow::toggleTorch);connect(m_startBtn, &QPushButton::clicked,this, [this]() { toggleCamera(true); });connect(m_stopBtn, &QPushButton::clicked,this, [this]() { toggleCamera(false); });connect(m_captureBtn, &QPushButton::clicked,this, &AdvancedCameraWindow::captureImage);connect(m_zoomSlider, &QSlider::valueChanged,this, &AdvancedCameraWindow::setZoom);connect(m_exposureSlider, &QSlider::valueChanged,this, &AdvancedCameraWindow::setExposureCompensation);}void setupCamera(){if (!m_camera) return;m_camera->setViewfinder(m_viewfinder);// 设置图像捕获m_imageCapture = new QCameraImageCapture(m_camera, this);m_camera->setCaptureMode(QCamera::CaptureStillImage);connect(m_imageCapture, &QCameraImageCapture::imageCaptured,this, &AdvancedCameraWindow::imageCaptured);// 获取控制接口m_focus = m_camera->focus();m_exposure = m_camera->exposure();m_flashControl = m_camera->exposure(); // Flash control is part of exposure}void updateCameraCapabilities(){// 更新UI以反映当前摄像头的功能if (m_exposure) {bool hasTorch = m_exposure->isFlashModeSupported(QCameraExposure::FlashTorch);m_torchCheck->setEnabled(hasTorch);m_torchCheck->setChecked(false);}if (m_focus) {bool canZoom = m_focus->isAvailable() && m_focus->isZoomModeSuppo

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/927386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

邢台网站建设服务周到网站域名 英文

grad norm先降后升再降正常嘛 在深度学习中,梯度的范数通常被用来衡量模型参数的更新程度,也就是模型的学习进度。在训练初期,由于模型参数的初始值比较随机,梯度的范数可能会比较大,这是正常现象。随着模型的训练&…

你必须知道的TCP和UDP核心区别,快速搞懂这两大协议!

UDP与TCP详解1. TCP (Transmission Control Protocol) 概念 TCP(传输控制协议)是一种面向连接的、可靠的传输协议。它负责将数据从源主机传输到目标主机,并确保数据的完整性、顺序和正确性。 原理三次握手:在数据传…

机器学习——朴素贝叶斯详解 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

[swift 外部干涉法 extension]

/*** Definition for singly-linked list.* public class ListNode {* public var val: Int* public var next: ListNode?* public init(_ val: Int) {* self.val = val* self.next = ni…

2025国庆Day3

模拟赛 T1 对每个ai开个桶分别算答案即可 注意long long T2 维护m个指针 倒着枚举l p1~pm维护第i个字符已匹配的下标 每次匹配修改一个前缀 复杂度O(n) 另外可考虑:T3 设dpi,j表示i子树内钦定返祖j次的方案数 将相邻向…

量子迁移计划启动:应对未来密码学挑战

荷兰国家安全与网络安全中心发布量子迁移指南,指出量子计算机将在2030-2040年间破解当前主流加密算法,呼吁组织立即行动转向量子安全密码学,保护信息机密性、完整性和可用性。启动量子迁移计划 新闻稿 | 2024年3月2…

找网站公司企业备案搭建微信网站怎么做

使用ArticleColumnForm表单,向数据库提交内容,内容包括column。如果同一用户提交的column重复,则提示表单出错,表单提交失败后,重新渲染表单提交html页面,其中提示错误信息。 涉及的代码包括: …

HPE SPP 2025.09.00.00 - HPE 服务器固件、驱动程序和系统软件包

HPE SPP 2025.09.00.00 - HPE 服务器固件、驱动程序和系统软件包HPE SPP 2025.09.00.00 - HPE 服务器固件、驱动程序和系统软件包 Service Pack for ProLiant Gen12, Gen11, Gen10 Released Oct 2025 请访问原文链接:…

大模型原理与实践:第三章-预训练语言模型详解_第1部分-Encoder-only(BERT、RoBERTa、ALBERT) - 指南

大模型原理与实践:第三章-预训练语言模型详解_第1部分-Encoder-only(BERT、RoBERTa、ALBERT) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bl…

详细介绍:Linux字符设备驱动开发全攻略

详细介绍:Linux字符设备驱动开发全攻略pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

河南焦作有做网站开发的公司吗连云港今天的新消息

11月12日,由金蝶软件(中国)(以下简称“金蝶”)主办的2022全球创见者大会之“对标世界一流管理——走进一心堂暨生命科学行业峰会”在云南昆明顺利举办。金蝶携手众多企业经营管理者,业界思想领袖及先锋企业…

深入解析:uniapp集成语音识别与图片识别集成方案【百度智能云】

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

sql注入和xss漏洞

1、复习信息搜集中的Google hack语法,随机找10个php网站的后台地址 2、简述sql注入漏洞的原理及危害 原理:由于后端程序员未对用户输入的字符进行严格控制和过滤,导致黑客可以在后台程序员不知情的情况下注入SQL语法…

威海建设局官方网站长沙室内设计工作室

加载指定会话最近消息 前言 上一集我们就把三个标签页的加载列表的任务给完成啦!那么我们这一集就来完成加载指定绘画最近消息的任务。 需求分析 我们点击了某个会话之后,我们就会去显示我们的会话的最近的N条消息。请看下图。 我们这里涉及到两个区…

大连企业网站建设模板wordpress 设置语言

http://www.elecfans.com/article/89/92/2017/20170425510728.html转载于:https://www.cnblogs.com/jackn-crazy/p/7300228.html

数学 trick

基本不等式遇到 \(x=\dfrac{一次函数}{一次函数}\),考虑分离出一个常数: 例:(2024 浙江模拟)已知实数 \(x,y,x>3,xy+2x-3y=12,(x+y)_{\min}\)? 解:考虑分离 \(x,y\),由 \(xy+2x-3y=12\) 得到 \(x=\dfrac{12…

免费网站下载app软件免费重庆seo优

本文来自网易云社区作者:田亚楠须知本文主要是根据 createjs 中的 EaselJS 在 github 上的 tutorials 目录下的文章整理而来 (原文链接),同时也包含了很多本人的理解,如过有叙述不当的地方,请联系我 :-D 本…

Python 2025:异步革命与AI驱动下的开发新范式 - 详解

Python 2025:异步革命与AI驱动下的开发新范式 - 详解2025-10-04 16:56 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; di…

完整教程:精读C++20设计模式——行为型设计模式:解释器模式

完整教程:精读C++20设计模式——行为型设计模式:解释器模式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

js疑惑

textBox.addEventListener("keydown", function (event) { console.log(`You pressed "${event.key}".`);});这个函数接收的"keydown",到底是什么意思我还是没看懂为什么会这样写看着也…