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.mzph.cn/news/791357.shtml

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

相关文章

Linux实验过程

答案截图获取&#xff0c;代写&#xff1a; https://laowangall.oss-cn-beijing.aliyuncs.com/studentall.pdf 基本任务&#xff1a; 1.Linux操作系统安装 2.vi文本编辑 3. Linux用户及文件管理命令 4. Linux权限管理命令 5. Linux网络服务 提高任务&#xff1a; 1、Li…

DIY蓝牙键盘(1) - 理解 键盘报文(免费)

DIY蓝牙键盘(1) - 理解键盘报文 1. 键盘报文体验 一个键盘对于用户的体验是&#xff0c;用户按按键A他能看到字母A会在主机上显示出来。那这是如何实现的&#xff1f; 其实很简单&#xff0c;只要键盘发送下面的两个报文给主机&#xff0c;字母A就能在主机上显示出来。 (1)…

数据结构——图的应用(最小生成树,最短路径,拓扑排序,关键路径)

目录 1.最小生成树 1.概念回顾——生成树 2.最小生成树概念 2.构造最小生成树 1.MST性质 2.Prim算法 3.Kruskal 算法 4.两种算法比较 3.最短路径 1.两点间最短路径 2.某源点到其它各点最短路径 3.单源最短路径——用Dijkstra算法 4.所有顶点间的最短路径…

Flask Python:模糊查询filter和filter_by,数据库多条件查询

数据库&#xff08;sqlalchemy&#xff09;多条件查询 前言一、filter、filter_by实现过滤查询1、filter_by()基础查询并且查询&#xff08;多条件查询&#xff09; 2、filter()like&#xff1a;模糊查询and&#xff1a;并且查询or&#xff1a;或者查询 二、all(),first(),get(…

【一站式学会Kotlin】第一节 kotlin 介绍

作者介绍&#xff1a; 百度资深Android工程师T6&#xff0c;在百度任职7年半。 目前&#xff1a;成立赵小灰代码工作室&#xff0c;欢迎大家找我开发Android、微信小程序、鸿蒙项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默。给大家…

中文Mistral模型介绍(Chinese-Mistral)——中文大语言模型

中文Mistral简介 Chinese-Mistral由清华大学地学系地球空间信息科学实验室开发。 该模型基于Mistral发布的Mistral-7B-v0.1训练得到。首先进行中文词表扩充&#xff0c;然后采用实验室提出的PREPARED训练框架&#xff08;under review&#xff09;在中英双语语料上进行增量预训…

RUST语言基本数据类型认识

1.RUST的基本数据类型参考: 2.使用RUST数据类型声明变量并赋值: let a:i81;//8位有符号整数let a1:u82;//8位无符号整数let b:i161;//16位有符号整数let b1:u162;//16位无符号整数let c:i321;//32位有符号整数let c1:u322;//32位无符号整数let d:i641;//64位有符号整数let d1:u…

C#编写MQTT客户端软件

主要参考C#MQTT编程06--MQTT服务器和客户端(winform版)_c#mqttserver-CSDN博客 但由于使用的.NET版本和MQTT库版本存在差异&#xff0c;因此有些不同。 MQTT协议内容在此不做描述&#xff0c;仅介绍VS使用C#的实现过程。本次使用VS2015&#xff0c;.netframwork4.6。 C#语言本身…

SQL server 查询数据库中所有的表名及行数

SQL server 查询数据库中所有的表名及行数 select a.name,b.rows from sysobjects as ainner join sysindexes as bon a.id b.id where (a.type u)and (b.indid in (0, 1)) and b.rows<50 and b.rows>20 order by a.name, b.rows desc;

Express框架搭建项目 node.js

文章目录 引言Express框架介绍express安装环境准备写一个简单的项目展示 文章总结 引言 Express是一个基于Node.js平台的轻量级Web应用框架&#xff0c;它提供了简洁的API和丰富的功能&#xff0c;使得开发者能够快速地构建Web服务器和API。本文将带领大家从零开始&#xff0c…

GDAL源码剖析(六)之GDAL开发及其调试

GDAL源码剖析&#xff08;六&#xff09;之GDAL开发及其调试-CSDN博客 一、简单的调用 关于GDAL的使用&#xff0c;网上的资料都很多&#xff0c;主要还是要熟悉GDAL的组织结构&#xff0c;类以及类的函数等&#xff0c;熟悉了&#xff0c;使用GDAL就不在话下了。最常用的就是…

苹果手表Apple Watch录了两个半小时的录音,却只能播放4秒,同步到手机也一样,还能修复好吗?

好多人遇到这个情况&#xff0c;用苹果手表Apple Watch录音&#xff0c;有的录1个多小时&#xff0c;有的录了3、4小时&#xff0c;甚至更长时间&#xff0c;因为手表没电&#xff0c;忘记保存等原因造成录音损坏&#xff0c;都是只能播放4秒&#xff0c;同步到手机也一样&…

JavaScript基础代码练习之冒泡排序

一、要求对一个数组进行冒泡排序&#xff0c;并将排序后的结果输出到控制台。在代码中&#xff0c;数组 arr 包含了一组数字&#xff0c;然后使用嵌套的循环来进行冒泡排序。 二、编写代码 <!DOCTYPE html> <html lang"en"><head><meta chars…

软件测试用例(2)

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

深挖苹果Find My技术,伦茨科技ST17H6x芯片赋予产品功能

苹果发布AirTag发布以来&#xff0c;大家都更加注重物品的防丢&#xff0c;苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch&#xff0c;如今的Find My已经不单单可以查找苹果的设备&#xff0c;随着第三方设备的加入&#xff0c;将丰富Find My Network的版图。产…

fastadmin学习08-查询数据渲染到前端

index.php查询&#xff0c;这个是前台的index.php public function index() {$slideImgs Db::name("slideimg")->where("status",,normal)->limit(5)->order(sort,desc)->select();$productList Db::name("product")->where(…

python的垃圾回收

引用计数器为主&#xff0c;标记清除和分代回收为辅 1 引用计数器 在python程序运行时&#xff0c;会根据数据类型的不同找到其对应的结构体&#xff0c;根据结构体中的字段来进行创建相关的数据&#xff0c;然后将对象添加到refchain双像链表中&#xff0c;每个对象中的ob_re…

Java中生成JWT令牌

1. 在pom.xml中引入依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency> 2. 使用Jwts的相关方法生成令牌 import io.jsonwebtoken.Jwts; import io.…

【单片机家电产品学习记录--蜂鸣器】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 单片机家电产品–蜂鸣器 前言 记录学习单片机家电产品内容 已转载记录为主 一、知识点 1电子电路学习笔记&#xff08;17&#xff09;——蜂鸣器 蜂鸣器种类和原理 2疑…

虹科Pico汽车示波器 | 免拆诊断案例 | 2019款别克GL8豪华商务车前照灯水平调节故障

一、故障现象 一辆2019款别克GL8豪华商务车&#xff0c;搭载LTG发动机&#xff0c;累计行驶里程约为10.7万km。车主反映&#xff0c;车辆行驶过程中组合仪表提示前照灯水平调节故障。 二、故障诊断 接车后试车&#xff0c;起动发动机&#xff0c;组合仪表上提示“前照灯水平…