Qt使用opencv,进行视频录制,功能打开、关闭摄像头,开始、结束录制视频,暂停、继续录制,并保存视频文件

1.效果图

2 代码实现

2.1 .h文件

#ifndef VIDEORECORDWIDGET_H
#define VIDEORECORDWIDGET_H#include <QWidget>#include<QFileDialog>#include <QImage>
#include <QLabel>
#include <QTimer>
#include <opencv2/opencv.hpp>using namespace cv;
namespace Ui {
class VideoRecordWidget;
}class VideoRecordWidget : public QWidget
{Q_OBJECTpublic:explicit VideoRecordWidget(QWidget *parent = nullptr);~VideoRecordWidget();private slots:void on_pushButton_clicked();void on_pushButton_2_clicked();void on_pushButton_3_clicked();void on_pushButton_5_clicked();void on_pushButton_4_clicked();void updateFrame();void on_pushButton_6_clicked();private:Ui::VideoRecordWidget *ui;VideoCapture capture;// QTimer timer;VideoWriter videoWriter;bool m_video_open;bool m_video_record;QTimer timer_open;QTimer timer_record;String recordViedo_fileName;};#endif // VIDEORECORDWIDGET_H

2.2 .cpp文件

#include "videorecordwidget.h"
#include "ui_videorecordwidget.h"VideoRecordWidget::VideoRecordWidget(QWidget *parent): QWidget(parent), ui(new Ui::VideoRecordWidget)
{ui->setupUi(this);m_video_open=false;m_video_record=false;// connect(&timer, &QTimer::timeout, this, &VideoRecordWidget::updateFrame);}VideoRecordWidget::~VideoRecordWidget()
{delete ui;
}//开启摄像头
void VideoRecordWidget::on_pushButton_clicked()
{// 打开摄像头capture.open(0);if (!capture.isOpened()) {qDebug("Failed to open camera.");return;}qDebug()<<"摄像头开启中";// 开始定时器,以固定间隔刷新显示视频图像timer_open.start(33); // 控制帧率为30fpsm_video_open=true;connect(&timer_open, &QTimer::timeout, this, &VideoRecordWidget::updateFrame);
}//关闭摄像头
void VideoRecordWidget::on_pushButton_2_clicked()
{// 关闭摄像头qDebug()<<"摄像头关闭中";capture.release();ui->label->clear();ui->label->setText("视频录制器");timer_open.stop();m_video_open=false;if(m_video_record){qDebug()<<"结束录制";m_video_record=false;timer_record.stop();videoWriter.release();}}//开始录制
void VideoRecordWidget::on_pushButton_3_clicked()
{if(m_video_open){if(videoWriter.isOpened()){qDebug()<<"已经有录制项目:"<<recordViedo_fileName<<"请先结束录制,再操作";return;}// 获取当前时间作为视频文件名std::time_t time = std::time(0);std::ostringstream oss;oss << "video_" << time << ".avi";recordViedo_fileName=oss.str();// std::string filename = oss.str();ui->lineEdit->setText(recordViedo_fileName.c_str());qDebug()<<"摄像头开启中-并进行录制,文件名:"<<recordViedo_fileName;timer_record.start(1000/25); // 控制帧率为30fpsm_video_record=true;cv::Mat frame;capture >> frame; // 从视频流中捕获当前帧int codec = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');double fps = 25.0;cv::Size frameSize(frame.cols, frame.rows);// if(videoWriter.isOpened()){//     videoWriter.write(frame);//     return;// }videoWriter.open(recordViedo_fileName, codec, fps, frameSize);connect(&timer_record, &QTimer::timeout, this, &VideoRecordWidget::updateFrame);}else{qDebug()<<"请先打开摄像头";}}//暂停录制
void VideoRecordWidget::on_pushButton_5_clicked()
{qDebug()<<"暂停录制";m_video_record=false;}//结束录制
void VideoRecordWidget::on_pushButton_4_clicked()
{qDebug()<<"结束录制";m_video_record=false;timer_record.stop();videoWriter.release();}void VideoRecordWidget::updateFrame()
{if(m_video_open){cv::Mat frame;capture >> frame; // 从视频流中捕获当前帧if (frame.empty()) {return;}// 将OpenCV的Mat图像转换为Qt的QImageQImage qimage(frame.data, frame.cols, frame.rows, static_cast<int>(frame.step), QImage::Format_BGR888);QPixmap pixmap = QPixmap::fromImage(qimage);// 设置QLabel显示图像ui->label->setPixmap(pixmap.scaled(ui->label->size(), Qt::KeepAspectRatio));if(m_video_record){qDebug()<<"录制中";// 创建 VideoWriter 对象// 检查是否成功打开视频文件if (!videoWriter.isOpened()){qDebug() << "无法打开视频文件.";return;}videoWriter.write(frame);}}
}
//继续录制
void VideoRecordWidget::on_pushButton_6_clicked()
{qDebug()<<"继续录制";m_video_record=true;}

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

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

相关文章

面试题:JVM 调优

一、JVM 参数设置 1. tomcat 的设置 vm 参数 修改 TOMCAT_HOME/bin/catalina.sh 文件&#xff0c;如下图 JAVA_OPTS"-Xms512m -Xmx1024m" 2. springboot 项目 jar 文件启动 通常在linux系统下直接加参数启动springboot项目 nohup java -Xms512m -Xmx1024m -jar…

智慧展览馆:基于AI智能识别技术的视频智慧监管解决方案

一、建设背景 随着科技的不断进步和社会安全需求的日益增长&#xff0c;展览馆作为展示文化、艺术和科技成果的重要场所&#xff0c;其安全监控系统的智能化升级已成为当务之急。为此&#xff0c;旭帆科技&#xff08;TSINGSEE青犀&#xff09;基于视频智能分析技术推出了展览馆…

内存和网卡压力测试

1.内存压力测试 1.1测试目的 内存压力测试的目的是评估开发板中的内存子系统性能和稳定性&#xff0c;以确保它能够满足特定的应用需求。开发板通常用于嵌入式系统、物联网设备、嵌入式智能家居等场景&#xff0c;这些场景对内存的要求通常比较高。 其内存压力测试的主要目的…

Spark 的结构化 APIs——RDD,DataFrame, Dataset, SparkSQL 使用和原理总结

文章目录 前言RDD的底层是什么?结构化 Spark主要优点和好处 DataFrame APISpark的基本数据类型Spark的结构化和复杂数据类型Schemas 和创建 DataFramesColumns 和 ExpressionsRows通用的 DataFrame 算子 The Dataset API有类型 Objects、无类型 Objects 和通用 Rows创建 Datas…

银行数字化转型导师坚鹏:银行数字化转型必知的3大客户分析维度

银行数字化转型需要进行客户分析&#xff0c;如何进行客户分析呢&#xff1f;银行数字化转型导师坚鹏认为至少从客户需求分析、客户画像分析、客户购买行为分析3个维度进行客户分析。 1.客户需求分析 银行数字化转型需要了解客户需求&#xff0c;不同年龄段的客户有不同的需求…

RisingWave 在品高股份 Bingo IAM 中的应用

背景介绍 公司背景 品高股份&#xff0c;是国内专业的云计算及行业信息化服务提供商。公司成立于 2003 年&#xff0c;总部位于广州&#xff0c;下设多家子公司和分公司&#xff0c;目前员工总数近 900 人&#xff0c;其中 80 %以上是专业技术人员。 品高股份在 2008 年便开…

AcWing 4405. 统计子矩阵:做题笔记

目录 暴力思路 代码 前缀和双指针 代码 解释 推荐博客 这道题的主要思路就是枚举所有的子矩阵&#xff0c;判断符合条件的子矩阵的个数。 暴力思路 我服了&#xff0c;其实我最开始没有想到 &#xff1a;枚举所有的子矩阵 这样一个很有总结性的要点。 我是想着哦我先…

【深度学习|Pytorch】torchvision.datasets.ImageFolder详解

ImageFolder详解 1、数据准备2、ImageFolder类的定义transforms.ToTensor()解析 3、ImageFolder返回对象 1、数据准备 创建一个文件夹&#xff0c;比如叫dataset&#xff0c;将cat和dog文件夹都放在dataset文件夹路径下&#xff1a; 2、ImageFolder类的定义 class ImageFol…

【系统架构师】-软件架构评估

1、质量属性 1、性能 系统的响应能力&#xff0c;响应时间、吞吐量&#xff0c; 策略&#xff1a;优先级队列、资源调度 2、可用性 系统正常运行的时间比例&#xff08;两次故障之间的时间长度&#xff09;&#xff0c;故障间隔时间&#xff0c; 策略&#xff1a;冗余、心…

AI预测福彩3D第26弹【2024年4月4日预测--第4套算法重新开始计算第11次测试】

今天清明节假日&#xff0c;一会要外出&#xff0c;可能要晚点回来。咱们尽早先把预测数据跑完&#xff0c;把结果发出来供各位彩友参考。合并下算法&#xff0c;3D的预测以后将重点测试本套算法&#xff0c;因为本套算法的命中率较高。以后有时间的话会在第二篇文章中发布排列…

UniApp 应用发布到苹果商店指南

&#x1f680; 想要让你的 UniApp 应用在苹果商店亮相吗&#xff1f;别着急&#xff0c;让我来带你一步步完成这个重要的任务吧&#xff01;在这篇博客中&#xff0c;我将详细介绍如何将 UniApp 应用顺利发布到苹果商店&#xff0c;让你的应用跻身于苹果生态之中。 引言 &…

2024年泰迪杯数据挖掘B题详细思路代码文章教程

目前b题已全部更新包含详细的代码模型和文章&#xff0c;本文也给出了结果展示和使用模型说明。 同时文章最下方包含详细的视频教学获取方式&#xff0c;手把手保姆级&#xff0c;模型高精度&#xff0c;结果有保障&#xff01; 分析&#xff1a; 本题待解决问题 目标&#…

Linux基础篇:VMware centos7虚拟机网络配置——桥接模式

VMware centos7虚拟机网络配置——桥接模式 1 搞清楚什么是桥接模式 桥接模式允许虚拟机直接连接到物理网络&#xff0c;就像它是物理网络中的一个独立设备一样。在这种模式下&#xff0c;虚拟机将具有与宿主机相同网络中的其他设备相同的网络访问权限。虚拟机将获得一个独立…

css心跳动画

图标引入 <img class"icon" src"heart.svg" alt"" srcset""> CSS代码 <style>.icon {animation:bpm 1s linear,pulse 0.75s 1s linear infinite;}keyframes pulse {from,75%,to {transform: scale(1);}25% {transform:…

RocketMQ(版本4.9.4)+RocketMQ_Dashbord环境搭建(生产者、消费者的前置环境搭建)

一、官方网站下载 RocketMQ源码包 https://rocketmq.apache.org/zh/docs/4.x/introduction/02quickstart 二、把rocketMQ上传到Linux环境下解压&#xff0c;编译&#xff0c;执行以下命令&#xff08;需要提前装jdk和maven并配置好环境变量&#xff09; unzip rocketmq-all-4…

Postman和Python Request测试多行Form-data

1、请求参数有多个&#xff0c;F12查看请求体如下&#xff1a; 查看源代码&#xff1a; ------WebKitFormBoundaryHknGXm9VkhRUXZYC Content-Disposition: form-data; name"custId"IICON004 ------WebKitFormBoundaryHknGXm9VkhRUXZYC Content-Disposition: form-da…

强大缓存清理工具 NetShred X for Mac激活版

NetShred X for Mac是一款专为Mac用户设计的强大缓存清理工具&#xff0c;旨在帮助用户轻松管理和优化系统性能。这款软件拥有直观易用的界面&#xff0c;即使是初次使用的用户也能快速上手。 软件下载&#xff1a;NetShred X for Mac激活版下载 NetShred X能够深入扫描Mac系统…

Golang | Leetcode Golang题解之第7题整数反转

题目&#xff1a; 题解&#xff1a; func reverse(x int) (rev int) {for x ! 0 {if rev < math.MinInt32/10 || rev > math.MaxInt32/10 {return 0}digit : x % 10x / 10rev rev*10 digit}return }

doccano标注工具|为机器学习建模做数据标注

目录 一、标记流程 二、配置环境 2.1 安装 2.2 运行doccano 三、案例 3.1 创建项目 3.2 上传数据 3.3 定义标签 3.4 添加成员 3.5 开始标注 3.6 导出数据 3.7 导出数据 doccano doccano是开源的数据…

软件测试用例(2)

具体的设计方法 -- 黑盒测试 因果图 因果图是一种简化的逻辑图, 能直观地表明程序的输入条件(原因)和输出动作(结果)之间的相互关系. 因果图法是借助图形来设计测试用例的一种系统方法, 特别适用于被测试程序具有多种输入条件, 程序的输出又依赖于输入条件的各种情况. 因果图…