【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();
}

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

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

相关文章

Mybatis的优缺点及适用场景?

目录 一、什么是Mybatis&#xff1f; 二、Mybatis框架的特点 三、Mybatis框架的优点&#xff1f; 四、MyBatis 框架的缺点&#xff1f; 五、MyBatis 框架适用场合&#xff1f; 六、代码示例 1. 配置文件 mybatis-config.xml 2. 映射文件 UserMapper.xml 3. Java 代码…

coco_eval 使用

参考 coco eval 解析 COCO目标检测比赛中的模型评价指标介绍&#xff01; coco 的评估函数对应的是 pycocotools 中的 cocoeval.py 文件。 从整体上来看&#xff0c;整个 COCOeval 类的框架如图&#xff1a; 基础的用法为 # The usage for CocoEval is as follows: cocoGt…

深入解析视频美颜SDK:开发直播平台主播专用的美颜工具教学

本篇文章&#xff0c;笔者将深入解析视频美颜SDK的原理与应用&#xff0c;帮助开发者打造适用于直播平台的专业美颜工具。 一、视频美颜SDK的基础原理 视频美颜SDK其核心技术包括人脸检测、面部特征点识别、图像增强和特效应用等。 二、视频美颜SDK的开发流程 环境搭建 首先…

Redis+Caffeine 实现两级缓存

RedisCaffeine 实现两级缓存 背景 ​ 事情的开始是这样的&#xff0c;前段时间接了个需求&#xff0c;给公司的商城官网提供一个查询预计送达时间的接口。接口很简单&#xff0c;根据请求传的城市仓库发货时间查询快递的预计送达时间。因为商城下单就会调用这个接口&#xff…

人工智能建立在对象存储上的真正原因

tl;dr: 在这篇文章中&#xff0c;我们将探讨 AI 工作负载依赖高性能对象存储的四个技术原因。 1. 对非结构化数据没有限制 在当前的机器学习范式中&#xff0c;性能和能力与计算成比例&#xff0c;计算实际上是数据集大小和模型大小的代理&#xff08;神经语言模型的缩放定律&a…

74HC165芯片验证

目录 0x01 74HC165芯片介绍0x02 编程实现 0x01 74HC165芯片介绍 74HC165的引脚定义如下&#xff0c;长这个样子 ABCDEFGH是它的八个输入引脚&#xff0c;例如你可以将它连接按键&#xff0c;让它来读取8个按键值。也可以将他级联其它的74165&#xff0c;无需增加单片机GPIO引…

Msfvenom制作自己的专属Shell

Msfvenom制作自己的专属Shell 如何通过Msfvenom来生成用户自己的专属Shell?有时候我们上传Shell到目标主机后&#xff0c;不仅我们自己可以连接&#xff0c;其他用户也可以连接&#xff0c;有时候会导致我们丢失该Shell&#xff0c;甚至该shell被用户发现并查杀。 实验环境 …

HTTP 概况

Web的应用层协议是超文本传输协议(HyperTextTransferProtocol&#xff0c;HTTP)&#xff0c;它是 Web的核心。HTTP由两个程序实现:一个客户程序和一个服务器程序。客户程序和服务器程序运行在不同的端系统中&#xff0c;通过交换HTTP报文进行会话。HTTP定义了这些报文的结构以及…

【SVN-CornerStone客户端使用SVN-多人开发-解决冲突 Objective-C语言】

一、接下来,我们来说第三方的图形化界面啊, 1.Corner Stone:图形化界面,使用SVN, Corner Stone的界面,大概就是这样的, 1)左下角:是我们远程的一个仓库, 2)右上角:是我们本地的一些东西, 首先,在我的服务器上,再开一个仓库,叫做wechat, 我在这个里边,新建…

游戏AI的创造思路-技术基础-情感计算(2)

上一篇我们介绍了情感计算的基本支持&#xff0c;本篇将呈现情感计算在游戏AI中的使用实例~~~ 目录 7. 情感计算在游戏AI中的运用实例 7.1. RPG游戏中的运用实例 7.1.1. 实例背景 7.1.2. AI情感计算系统 7.1.3. 引导用户执行任务 7.1.4. 推动游戏剧情发展 7.1.5. 实例效…

如何才能半个月学习完自动化测试,成功跳槽涨薪?

一直想写类似的文章&#xff0c;但是一直没有时间&#xff0c;正好乘此周末&#xff0c;终于可以写写我的见解了<关于如何学习自动化测试>&#xff0c;其实自动化测试的知识很宽泛&#xff0c;具体细分又可以分为&#xff1a;Web自动化测试&#xff08;PythonSelenium&am…

红日靶场----(三)漏洞利用

上期已经信息收集阶段已经完成&#xff0c;接下来是漏洞利用。 靶场思路 通过信息收集得到两个吧靶场的思路 1、http://192.168.195.33/phpmyadmin/&#xff08;数据库的管理界面&#xff09; root/root 2、http://192.168.195.33/yxcms/index.php?radmin/index/login&am…

tensorflow之欠拟合与过拟合,正则化缓解

过拟合泛化性弱 欠拟合解决方法&#xff1a; 增加输入特征项 增加网络参数 减少正则化参数 过拟合的解决方法&#xff1a; 数据清洗 增大训练集 采用正则化 增大正则化参数 正则化缓解过拟合 正则化在损失函数中引入模型复杂度指标&#xff0c;利用给w增加权重&#xff0c;…

插入排序算法(C语言版)

直接插入排序 插入排序&#xff08;insert sort&#xff09;是一种简单的排序算法&#xff0c;它的工作原理与手动整理一副牌的过程非常相似。 具体来说&#xff0c;我们在未排序区间选择一个基准元素&#xff0c;将该元素与其左侧已排序区间的元素逐一比较大小&#xff0c;并…

【限时删!绝命Coding助力秋招】Python实现Boss海投脚本

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

GenAI 技术堆栈架构师指南 - 十种工具

这篇文章于 2024 年 6 月 3 日首次出现在 The New Stack 上。 我之前写过关于现代数据湖参考架构的文章&#xff0c;解决了每个企业面临的挑战——更多的数据、老化的Hadoop工具&#xff08;特别是HDFS&#xff09;以及对RESTful API&#xff08;S3&#xff09;和性能的更大需求…

YOLOv8改进 | 注意力机制 | 增强模型在图像分类和目标检测BAM注意力【小白必备 + 附完整代码】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

python破解密码·筛查和选择

破解密码时可能遇到的几种情况 ① 已知密码字符&#xff0c;破排序 ② 已知密码位数&#xff0c;破字符 ③ 已知密码类型&#xff0c;破字位 ④ 已知部分密码&#xff0c;破未知 ⑤ 啥都不知道&#xff0c;盲破&#xff0c;玩完 ⑥ 已知位数、字符、类型、部分密码中的几个&am…

AirPods Pro新功能前瞻:iOS 18的五大创新亮点

随着科技的不断进步&#xff0c;苹果公司一直在探索如何通过创新提升用户体验。iOS 18的推出&#xff0c;不仅仅是iPhone的一次系统更新&#xff0c;更是苹果生态链中重要一环——AirPods Pro的一次重大升级。 据悉&#xff0c;iOS 18将为AirPods Pro带来五项新功能&#xff0…

我的FPGA

1.安装quartus 2.更新usb blaster驱动 3.新建工程 1.随便找一个文件夹&#xff0c;里面新建demo文件夹&#xff0c;表示一个个工程 在demo文件夹里面&#xff0c;新建src&#xff08;源码&#xff09;&#xff0c;prj&#xff08;项目&#xff09;&#xff0c;doc&#xff…