【QT中实现摄像头播放、以及视频录制】
学习分享
- 1、效果图
- 2、camerathread.h
- 3、camerathread.cpp
- 4、mainwindow.h
- 5、mainwindow.cpp
- 6、main.cpp
1、效果图
2、camerathread.h
#ifndef CAMERATHREAD_H
#define CAMERATHREAD_H#include <QObject>
#include <QThread>
#include <QDebug>
#include <QImage>
#include <unistd.h>
#include <iostream>
#include <QDateTime>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class CameraThread :public QThread
{Q_OBJECT
public:static CameraThread *camerathread;static CameraThread *getInstance();void run();bool getIsRun() const;void setIsRun(bool value);int getFrame_width() const;int getFrame_height() const;void detecCarDaw(Mat &frame,CascadeClassifier &cascade,double scale);bool getIsStop() const;void setIsStop(bool value);bool getIsRecord() const;void setIsRecord(bool value);VideoWriter getWriter() const;bool getIsPersistent() const;void setIsPersistent(bool value);bool getIsRun_s() const;void setIsRun_s(bool value);
signals:void sendQImage(Mat frame);
private:CameraThread();CascadeClassifier cascade;//级联分类器的过滤器VideoCapture cap;Mat frame;VideoWriter writer;//OpenCV视频录制类bool isRun;//控制线程是否运行int frame_width;int frame_height;int recordNum; //录制帧率,设定为300帧bool isRun_s; //控制线程是否运行bool isStop; //控制线程结束bool isRecord; //控制线程是否开始录制bool isPersistent;
};#endif // CAMERATHREAD_H
3、camerathread.cpp
#include "camerathread.h"CameraThread * CameraThread::camerathread =nullptr;
CameraThread * CameraThread::getInstance()
{if(CameraThread::camerathread ==nullptr){CameraThread::camerathread =new CameraThread ();}return CameraThread::camerathread;
}
CameraThread::CameraThread()
{this->isRun =true;cap.open(0);// 获取摄像头的宽度和高度this->frame_width = static_cast<int>(cap.get(CAP_PROP_FRAME_WIDTH));this->frame_height = static_cast<int>(cap.get(CAP_PROP_FRAME_HEIGHT));// 定义视频编码格式、帧率和画面尺寸int fourcc = VideoWriter::fourcc('X', 'V', 'I', 'D');Size frameSize(frame_width, frame_height);this->isRun_s=false;this->isStop=false;this->isRecord=false;this->isPersistent=false;this->recordNum=0;}bool CameraThread::getIsStop() const
{return isStop;
}void CameraThread::setIsStop(bool value)
{isStop = value;
}bool CameraThread::getIsRecord() const
{return isRecord;
}void CameraThread::setIsRecord(bool value)
{isRecord = value;if(this->isRecord == false && writer.isOpened()){qDebug()<<"手动关闭"<<endl;writer.release();this->recordNum =0;}
}VideoWriter CameraThread::getWriter() const
{return writer;
}bool CameraThread::getIsPersistent() const
{return isPersistent;
}void CameraThread::setIsPersistent(bool value)
{isPersistent = value;
}bool CameraThread::getIsRun_s() const
{return isRun_s;
}void CameraThread::setIsRun_s(bool value)
{isRun_s = value;
}
void CameraThread::detecCarDaw(Mat &frame, CascadeClassifier &cascade, double scale)
{//灰度处理Mat gray;cvtColor(frame,gray,CV_BGR2GRAY);//将灰度图缩小一半//cvRound()用于四舍五入 CV_8UC1:单通道Mat smalling(cvRound(frame.rows/scale),cvRound(frame.cols/scale),CV_8UC1);//resize()改变大小 INTER_LINEAR 等比例缩小resize(gray,smalling,smalling.size(),0,0,INTER_LINEAR);//直方图均衡化:利用直方图函数将图像黑白分明 (结果跟二值化类似)equalizeHist(smalling,smalling);//进行模型检测vector<Rect>cars;cascade.detectMultiScale(smalling,cars,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30));//绘制边框vector<Rect>::const_iterator iter;//系统默认迭代器for(iter =cars.begin();iter!=cars.end();iter++){rectangle(frame,//原图cvPoint(cvRound(iter->x*scale),cvRound(iter->y*scale)),//左上角坐标cvPoint(cvRound((iter->x+iter->width)*scale),cvRound((iter->y+iter->height)*scale)),//右下角坐标Scalar(0,255,0),//绿色2,//像素大小8//亮度);}
}int CameraThread::getFrame_height() const
{return frame_height;
}int CameraThread::getFrame_width() const
{return frame_width;
}bool CameraThread::getIsRun() const
{return isRun;
}void CameraThread::setIsRun(bool value)
{isRun = value;
}
void CameraThread::run()
{cascade.load("D:/OpenCV/cars.xml");//识别级联分类器 车辆while(this->isRun ==true){if(cap.read(frame)){cvtColor(frame,frame,CV_BGR2RGB);detecCarDaw(frame,cascade,2);emit sendQImage(frame);if(this->isStop ==false)//控制线程结束{if(this->isRun_s == true)//控制线程是否运行{if(cap.read(frame)){if(this->isRecord==true){if(this->recordNum ==0){QDateTime current_date_time =QDateTime::currentDateTime();QString current_date =current_date_time.toString("yyyy-MM-dd-hh-mm-ss");//QString filename ="../data/"+current_date+".avi";QString filename ="D:/Qtsoft/videoDemo/data/"+current_date+".avi";qDebug()<<"filename="<<filename;writer.open(filename.toStdString().c_str(),CV_FOURCC('M','J','P','G'),30.0,Size(frame.cols,frame.rows),true);}if(!writer.isOpened()){qDebug()<<"录制路径失败!!!"<<endl;}else{if(this->recordNum<300){//当前帧不等于总帧数,录制300帧还没有结束//qDebug()<<"录制中..."<<endl;writer<<frame;this->recordNum++;}else{qDebug()<<"已经到300帧结束录制";writer.release();this->recordNum =0;if(this->isPersistent==true){this->isRecord =true;}else if(this->isPersistent ==false){this->isRecord =false;}}}}cvtColor(frame,frame,CV_BGR2RGB);}msleep(10);}}}}}
4、mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "camerathread.h"
namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();void paintEvent(QPaintEvent * Eevent);
private:Ui::MainWindow *ui;CameraThread *ct;
// VideoThread *vt;QImage image;Mat frame;
private slots:void isChecked(Mat frame);void on_pushButton_clicked();void on_checkBox_clicked(bool checked);
};#endif // MAINWINDOW_H
5、mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);this->ct =CameraThread::getInstance();connect(this->ct,SIGNAL(sendQImage(Mat)),this,SLOT(isChecked(Mat)),Qt::BlockingQueuedConnection);this->ct->start();
// this->vt =new VideoThread(0);
// this->vt->start();waitKey(40);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::paintEvent(QPaintEvent *Eevent)
{ui->label->setPixmap(QPixmap::fromImage(this->image));QImage q_image = QImage(frame.data,frame.cols,frame.rows,QImage::Format_RGB888);ui->label->setPixmap(QPixmap::fromImage(q_image));ui->label->setScaledContents(true);
}void MainWindow::isChecked(Mat frame)
{this->image =QImage(frame.data,frame.cols,frame.rows,QImage::Format_RGB888);this->image = this->image.scaled(ui->label->width(),ui->label->height());//以UI中的界面大小进行等比例缩放this->frame = frame.clone();this->update();
}void MainWindow::on_pushButton_clicked()
{if(this->ct->getWriter().isOpened()){qDebug()<<"已经有录制项目:请先结束录制,再操作";return;}this->ct->setIsRun_s(true);this->ct->setIsRecord(true);}void MainWindow::on_checkBox_clicked(bool checked)
{if(checked==true){//qDebug()<<"true";this->ct->setIsRecord(true);this->ct->setIsPersistent(true);}else if(checked==false){//qDebug()<<"false";this->ct->setIsPersistent(false);}
}
6、main.cpp
#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
相关文章:

【QT中实现摄像头播放、以及视频录制】
学习分享 1、效果图2、camerathread.h3、camerathread.cpp4、mainwindow.h5、mainwindow.cpp6、main.cpp 1、效果图 2、camerathread.h #ifndef CAMERATHREAD_H #define CAMERATHREAD_H#include <QObject> #include <QThread> #include <QDebug> #include &…...

el-table封装popver組件,点击列筛选行数据功能,支持筛选,搜索,排序功能
子组件: <template><div class"tableTool" ref"tableTool" click.stop><el-button click"shengFnc">升序</el-button><el-button click"jiangFnc">降序</el-button><el-input v-m…...

基于DPU的云原生计算资源共池管理解决方案
1. 方案背景和挑战 在传统的云环境中,通常存在着不同的技术栈,支撑多样化的计算服务,具体如下: ① OpenStack环境与虚拟化云主机及裸金属服务 OpenStack是一个开源的云计算管理平台项目,它提供了部署和管理大规模计…...
Bugly并非无所不能
在 iOS 应用因为内存占用过大而被系统 killed 的情况下,Bugly 以及大多数崩溃报告工具是无法捕获到这种类型的崩溃信息的。原因在于,当系统由于内存压力过大而终止应用时,是直接将应用进程杀死,不会触发常规的崩溃处理流程&#x…...

2024年信息系统项目管理师1批次上午客观题参考答案及解析(3)
51、探索各种选项,权衡包括时间与成本、质量与成本、风险与进度、进度与质量等多种因素,在整个过程中,舍弃无效或次优的替代方案,这种不确定性应对方法是()。 A.集合设计 B.坚韧性 C.多种结果…...

YOLOv8改进 | 注意力机制 | 对密集和小目标友好的EVAblock 【原理 + 完整代码】
秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效…...

高效前端开发:解密pnpm的存储与链接
什么是pnpm PNPM(Performant NPM)是一种快速且节省磁盘空间的包管理工具。相较于其他包管理器如NPM和Yarn,PNPM通过独特的存储机制和链接技术解决了许多常见的问题。以下是PNPM如何避免这些问题以及其关键技术的详细介绍。 特性 PNPM Store…...

设置单实例Apache HTTP服务器
配置仓库 [rootlocalhost ~]# cd /etc/yum.repos.d/ [rootlocalhost yum.repos.d]# vi rpm.repo仓库代码: [BaseOS] nameBaseOS baseurl/mnt/BaseOS enabled1 gpgcheck0[AppStream] nameAppStream baseurl/mnt/AppStream enabled1 gpgcheck0挂载 [rootlocalhost …...

Python | Leetcode Python题解之第221题最大正方形
题目: 题解: class Solution:def maximalSquare(self, matrix: List[List[str]]) -> int:if len(matrix) 0 or len(matrix[0]) 0:return 0maxSide 0rows, columns len(matrix), len(matrix[0])dp [[0] * columns for _ in range(rows)]for i in…...
使用Python实现线性拟合
如下 Python 代码主要用于处理和分析数据,并使用 Matplotlib 库绘制出数据的拟合曲线。它的主要步骤包括数据预处理、进行线性回归分析,并根据结果绘图展示。下面是对代码及其所引用库的详细解释: 引用的库 numpy (np): 用于进行数值计算。这…...

如何在浏览器控制台Console中引入外部 JS
想要在某个网页执行一些脚本,却发现某个工具类,如 ajax 请求的 axios 该网页没有引入,或者引入了但控制台却访问不到,这时要怎么办呢? 只需要控制台执行如下代码就好了 var script document.createElement(script);…...

后端——全局异常处理
一、老办法try-catch 当我们执行一些错误操作导致程序报错时,程序会捕捉到异常报错,这个异常会存在一个Exception对象里 那我们在spring boot工程开发时,当我们执行一个sql查询时报错了,那就会从最底层的Mapper层捕捉到Exceptio…...

软件开发面试题(C#语言,.NET框架)
1. 解释什么是委托(Delegate),并举例说明它在C#中的用法。 委托是一种引用类型,它可以用于封装一个或多个方法。委托对象可以像方法一样调用,甚至可以用于创建事件处理程序。委托是C#中实现事件和回调函数的重要机制。…...

Spring学习04-[Spring容器核心技术AOP学习]
AOP学习 AOP介绍使用对业务方法添加计算时间的增强 EnableAspectJAutoProxyAOP的术语通知前置通知Before后置通知After返回通知AfterReturning异常通知AfterThrowing总结-通知执行顺序 切点表达式的提取-使用Pointcut进行抽取切点表达式的详细用法execution和annotation组合 Sp…...

第5章-组合序列类型
#全部是重点知识,必须会。 了解序列和索引|的相关概念 掌握序列的相关操作 掌握列表的相关操作 掌握元组的相关操作 掌握字典的相关操作 掌握集合的相关操作1,序列和索引 1,序列是一个用于存储多个值的连续空间,每一个值都对应一…...

大话光学原理:2.最短时间原理、“魔法石”与彩虹
一、最短时间原理 1662年左右,费马在一张信纸的边角,用他那著名的潦草笔迹,随意地写下了一行字:“光在两点间选择的路,总是耗时最少的。”这句话,简单而深邃,像是一颗悄然种下的种子,…...

spring tx @Transactional 详解 `Advisor`、`Target`、`ProxyFactory
在Spring中,Transactional注解的处理涉及到多个关键组件,包括Advisor、Target、ProxyFactory等。下面是详细的解析和代码示例,解释这些组件是如何协同工作的。 1. 关键组件介绍 1.1 Advisor Advisor是一个Spring AOP的概念,它包…...
`CyclicBarrier` 是 Java 中的一个同步辅助工具类,它允许一组线程相互等待,直到所有线程都达到了某个公共屏障点(barrier point)
CyclicBarrier 是 Java 中的一个同步辅助工具类,它允许一组线程相互等待,直到所有线程都达到了某个公共屏障点(barrier point)。当所有线程都到达屏障点时,它们可以继续执行后续操作。CyclicBarrier 的特点是可以重复使…...

华为机试HJ108求最小公倍数
华为机试HJ108求最小公倍数 题目: 想法: 要找到输入的两个数的最小公倍数,这个最小公倍数要大于等于其中最大的那个数值,遍历最大的那个数值的倍数,最大的最小公倍数就是输入的两个数值的乘积 input_number_list i…...

Debezium报错处理系列之第114篇:No TableMapEventData has been found for table id:256.
Debezium报错处理系列之第114篇:Caused by: com.github.shyiko.mysql.binlog.event.deserialization.MissingTableMapEventException: No TableMapEventData has been found for table id:256. Usually that means that you have started reading binary log within the logic…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...