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

qt5.14.2 opencv调用摄像头显示在label

ui界面添加一个Qlabel名字是默认的label

还有一个button名字是pushButton

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <opencv2/opencv.hpp>  // 添加OpenCV头文件
#include <QTimer>              // 添加定时器头文件QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_pushButton_clicked();void updateFrame();  // 新增的帧更新槽函数private:Ui::MainWindow *ui;cv::VideoCapture cap;  // OpenCV视频捕获对象QTimer *timer;         // 定时器对象
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv2/opencv.hpp>
#include <QTimer>
#include <QImage>
#include <QPixmap>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 初始化定时器timer = new QTimer(this);// 连接信号和槽connect(timer, &QTimer::timeout, this, &MainWindow::updateFrame);// 设置Label的缩放策略ui->label->setScaledContents(true);
}MainWindow::~MainWindow()
{// 释放资源if(cap.isOpened()) {cap.release();}if(timer->isActive()) {timer->stop();}delete ui;
}void MainWindow::on_pushButton_clicked()
{if (!timer->isActive()) {// 尝试打开摄像头cap.open(0); // 0表示默认摄像头if (!cap.isOpened()) {ui->label->setText("无法打开摄像头");return;}// 设置摄像头分辨率(可选)cap.set(cv::CAP_PROP_FRAME_WIDTH, 640);cap.set(cv::CAP_PROP_FRAME_HEIGHT, 480);timer->start(30); // 每30毫秒更新一帧ui->pushButton->setText("停止摄像头");} else {// 停止摄像头timer->stop();cap.release();ui->pushButton->setText("启动摄像头");ui->label->clear();}
}void MainWindow::updateFrame()
{cv::Mat frame;cap >> frame; // 从摄像头获取一帧if (!frame.empty()) {// 将OpenCV的BGR格式转换为RGBcv::cvtColor(frame, frame, cv::COLOR_BGR2RGB);// 将cv::Mat转换为QImageQImage img(frame.data,frame.cols,frame.rows,frame.step,QImage::Format_RGB888);// 将QImage转换为QPixmap并显示在Label上ui->label->setPixmap(QPixmap::fromImage(img));}
}

相关文章:

  • 小白学编程之——深入理解Java线程的完整生命周期
  • 【Boost搜索引擎】构建Boost站内搜索引擎实践
  • 《数字藏品APP开发:解锁高效用户身份认证与KYC流程》
  • 一个进程中可以有多个 WebView2 控件,它们各自有独立的用户数据目录,COOKIE共享
  • SpringBoot + Shiro + JWT 实现认证与授权完整方案实现
  • git版本控制学习
  • 本地跑通vue-element-admin项目
  • C++循环效率比较与优化建议
  • [逆向工程]DebugView捕获WPS日志?解析未运行WPS时Shell扩展加载的原因与解决方案(二十五)
  • 机器学习前言2
  • 从银行排队到零钱支付:用“钱包经济学”重构Java缓存认知
  • 【无标题】威灏光电哲讯科技MES项目启动会圆满举行
  • Vue主题色切换实现方案(CSS 变量 + 类名切换)
  • 存储器上如何存储1和0
  • 类模板的简单实例
  • mybatisPlus 新增时 其他字段的值和 id 保持一致实现方法
  • 基于Unity的简单2D游戏开发
  • Vue.js---计算属性computed和lazy
  • 用Python生成词云图的几种方式
  • Chrome拓展(Chrome Extension)开发定时任务插件
  • 尹锡悦宣布退出国民力量党
  • 深圳南澳码头工程环评将再次举行听证会,项目与珊瑚最近距离仅80米
  • “AD365特应性皮炎疾病教育项目”启动,助力提升认知与规范诊疗
  • 新任国防部新闻发言人蒋斌正式亮相
  • 曾犯强奸罪教师出狱后办教培机构?柳州鱼峰区教育局回应
  • 端午假期购票日历发布,今日可购买5月29日火车票