YOLOv8+PyQt:实时检测(摄像头、视频)

1.YOLO:CPU实时检测(摄像头、视频)https://blog.csdn.net/qq_45445740/article/details/106557451

2.YOLOv8+PyQt,实现摄像头或视频的实时检测
需要安装 PySide6ultralytics

pip install PySide6 
pip install ultralytics
from PySide6 import QtWidgets, QtCore, QtGui
import cv2 as cv
import os, time
from threading import Thread# 屏蔽YOLO处理输出的调试信息
os.environ['YOLO_VERBOSE'] = 'False'
from ultralytics import YOLOclass MWindow(QtWidgets.QMainWindow):def __init__(self):super().__init__()# 设置界面self.setupUI()self.camBtn.clicked.connect(self.startCamera)self.videoBtn.clicked.connect(self.startVideoFile)self.stopBtn.clicked.connect(self.stop)# 定义定时器,用于控制显示摄像头视频的帧率self.timer_camera = QtCore.QTimer()# 定时到了,回调 self.show_cameraself.timer_camera.timeout.connect(self.show_camera)# 加载 YOLO nano 模型,第一次比较耗时,要20秒左右self.model = YOLO('yolov8m.pt')# 要处理的视频帧图片队列,目前就放1帧图片self.frameToAnalyze = []# 启动处理视频帧独立线程Thread(target=self.frameAnalyzeThreadFunc,daemon=True).start()# 定义定时器,用于控制显示视频文件的帧率self.timer_videoFile = QtCore.QTimer()# 定时到了,回调 self.show_cameraself.timer_videoFile.timeout.connect(self.show_videoFile)# 当前要播放的视频帧号self.vframeIdx = 0# cv.VideoCapture 实例self.cap = Noneself.stopFlag = Falsedef setupUI(self):self.resize(1200, 800)self.setWindowTitle(' YOLO-PyQt Demo')# central WidgetcentralWidget = QtWidgets.QWidget(self)self.setCentralWidget(centralWidget)# central Widget 里面的 主 layoutmainLayout = QtWidgets.QVBoxLayout(centralWidget)# 界面的上半部分 : 图形展示部分topLayout = QtWidgets.QHBoxLayout()self.label_ori_video = QtWidgets.QLabel(self)self.label_treated = QtWidgets.QLabel(self)self.label_ori_video.setFixedSize(520,400)self.label_treated.setFixedSize(520,400)# self.label_ori_video.setMinimumSize(520,400)# self.label_treated.setMinimumSize(520,400)self.label_ori_video.setStyleSheet('border:1px solid #D7E2F9;')self.label_treated.setStyleSheet('border:1px solid #D7E2F9;')topLayout.addWidget(self.label_ori_video)topLayout.addWidget(self.label_treated)mainLayout.addLayout(topLayout)# 界面下半部分: 输出框 和 按钮groupBox = QtWidgets.QGroupBox(self)bottomLayout =  QtWidgets.QHBoxLayout(groupBox)self.textLog = QtWidgets.QTextBrowser()bottomLayout.addWidget(self.textLog)mainLayout.addWidget(groupBox)btnLayout = QtWidgets.QVBoxLayout()self.videoBtn = QtWidgets.QPushButton('🎞️视频文件')self.camBtn   = QtWidgets.QPushButton('📹摄像头')self.stopBtn  = QtWidgets.QPushButton('🛑停止')btnLayout.addWidget(self.videoBtn)btnLayout.addWidget(self.camBtn)btnLayout.addWidget(self.stopBtn)bottomLayout.addLayout(btnLayout)def startCamera(self):# 参考 https://docs.opencv.org/3.4/dd/d43/tutorial_py_video_display.html# 在 windows上指定使用 cv.CAP_DSHOW 会让打开摄像头快很多,# 在 Linux/Mac上 指定 V4L, FFMPEG 或者 GSTREAMERself.cap = cv.VideoCapture(0, cv.CAP_DSHOW)if not self.cap.isOpened():print("1号摄像头不能打开")returnif self.timer_camera.isActive() == False:  # 若定时器未启动self.timer_camera.start(30)self.stopFlag = Falsedef show_camera(self):ret, frame = self.cap.read()  # 从视频流中读取if not ret:return# 把读到的帧的大小重新设置frame = cv.resize(frame, (520, 400))self.setFrameToOriLabel(frame)def setFrameToOriLabel(self,frame):# 视频色彩转换回RGB,OpenCV images as BGRframe = cv.cvtColor(frame, cv.COLOR_BGR2RGB)qImage = QtGui.QImage(frame.data, frame.shape[1], frame.shape[0],QtGui.QImage.Format_RGB888)  # 变成QImage形式# 往显示视频的Label里 显示QImageself.label_ori_video.setPixmap(QtGui.QPixmap.fromImage(qImage))# 如果当前没有处理任务if not self.frameToAnalyze:self.frameToAnalyze.append(frame)def frameAnalyzeThreadFunc(self):while True:if not self.frameToAnalyze:time.sleep(0.01)continueframe = self.frameToAnalyze.pop(0)results = self.model(frame)[0]img = results.plot(line_width=1)qImage = QtGui.QImage(img.data, img.shape[1], img.shape[0],QtGui.QImage.Format_RGB888)  # 变成QImage形式if self.stopFlag == False:self.label_treated.setPixmap(QtGui.QPixmap.fromImage(qImage))  # 往显示Label里 显示QImagetime.sleep(0.5)def stop(self, ):self.stopFlag = True      # 让 frameAnalyzeThreadFunc 不要再设置 label_treatedself.timer_camera.stop()  # 关闭定时器self.timer_videoFile.stop()  # 关闭定时器if self.cap:self.cap.release()  # 释放视频流# 清空视频显示区域self.label_ori_video.clear()self.label_treated.clear()# # 延时500ms清除,有的定时器处理任务可能会在当前时间点后处理完最后一帧# QtCore.QTimer.singleShot(500, clearLabels)def startVideoFile(self):# 先关闭原来打开的self.stop()videoPath, _  = QtWidgets.QFileDialog.getOpenFileName(self,             # 父窗口对象"选择视频文件",        # 标题".",               # 起始目录"图片类型 (*.mp4 *.avi)" # 选择类型过滤项,过滤内容在括号中)print('videoPath is', videoPath)if not videoPath:returnself.cap = cv.VideoCapture(videoPath)if not self.cap.isOpened():print("打开文件失败")returnself.timer_videoFile.start(30)self.stopFlag = Falseprint("ok")def show_videoFile(self):# 选取视频帧位置,self.cap.set(cv.CAP_PROP_POS_FRAMES, self.vframeIdx)self.vframeIdx += 1ret, frame = self.cap.read()  # 从视频流中读取# 读取失败,应该是视频播放结束了if not ret:self.stop()returnself.setFrameToOriLabel(frame)app = QtWidgets.QApplication()
window = MWindow()
window.show()
app.exec()

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

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

相关文章

基于docxtpl的模板生成Word

docxtpl是一个用于生成Microsoft Word文档的模板引擎库。它结合了docx模块和Jinja2模板引擎,使用户能够使用Microsoft Word模板文件并在其中填充动态数据。这个库提供了一种方便的方式来生成个性化的Word文档,并支持条件语句、循环语句和变量等控制结构&…

如何在 Elasticsearch 中选择精确 kNN 搜索和近似 kNN 搜索

作者:来自 Elastic Carlos Delgado kNN 是什么? 语义搜索(semantic search)是相关性排名的强大工具。 它使你不仅可以使用关键字,还可以考虑文档和查询的实际含义。 语义搜索基于向量搜索(vector search&…

Angular Ivy:新渲染引擎的性能提升与优化

Angular Ivy是Angular 9及更高版本中引入的默认渲染引擎,它取代了以前的View Engine。Ivy的目标是提高Angular的性能、减少包大小和提高开发者的生产力。 1. AOT编译的改进: 在Ivy中,Angular使用了更早的AOT(Ahead-of-Time&…

在AnolisOS8.9系统安装docker-compose

在AnolisOS8.9系统安装docker-compose 下载docker-compose之前请先确保docker已经安装完,教程可以参考 在阿里Anolis OS 8.9龙蜥操作系统安装docker 下载最新版的docker-compose文件 sudo curl -L https://github.com/docker/compose/releases/download/v2.21.0…

大数据工具之HIVE-参数调优,调度乱码(二)

一、调度乱码 在利用HUE工具,搭建WORKFLOW流程的过程中,如果直接执行hivesql数据正常,不会出现乱码现象,如果利用WORKFLOW搭建的流程,进行数据的拉取,会出现数据中文乱码现象,这些乱码主要是由于select 中的硬编码中文导致出现的现象 具体现象如下: select case when …

百度 提前批 国际化广告部 (深圳-机器学习/数据挖掘/自然语言处理工程师) 一面+二面面经

文章目录 0、面试情况1、一面1.1、简历上的项目介绍了个遍1.2、dbscan原理1.3、为什么梯度的负方向就是损失函数下降最快的方向?1.4、bn原理,为什么bn能解决过拟合,1.5、auc原理,为什么ctr或你的广告推荐里用auc指标?1…

TG5032CGN TCXO 超高稳定10pin端子型适用于汽车动力转向控制器

TG5032CGN TCXO / VC-TCXO是一款应用广泛的晶振,具有超高稳定性,CMOS输出和使用晶体基振的削波正弦波输出形式。且有低相位噪声优势,是温补晶体振荡器(TCXO)和压控晶体振荡器(VCXO)结合的产物,具有TCXO和VCXO的共同优点&#xff0…

后台接口返回void但是response有设置合适的相关信息,前端调用接口解析Blob数据下载excel文件

1、pom.xml文件增加依赖&#xff1a; <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId></dependency> 2、接口代码如下&#xff1a; /*** 企业列表--导出*/GetMapping(value "/downloadTenantL…

微信小程序上线必备:SSL证书申请以及安装

一、认识ssl证书 1、ssl证书是什么&#xff1f; SSL证书&#xff0c;全称Secure Socket Layer Certificate&#xff0c;是一种数字证书&#xff0c;它遵循SSL&#xff08;现在通常指TLS&#xff0c;Transport Layer Security&#xff09;协议标准&#xff0c;用于在客户端&…

SpringCloud系列(26)--OpenFeign超时控制

前言&#xff1a;在上一章节中我们简单的介绍了如何使用OprnFeign去调用微服务&#xff0c;因为消费侧和服务侧是两个不同的微服务&#xff0c;这样可能会出现超时的现象&#xff0c;例如服务侧需要3秒处理任何才能返回结果&#xff0c;但消费侧可能2秒就断开连接了&#xff0c…

【深度学习】2.单层感知机

目标&#xff1a; 实现一个简单的二分类模型的训练过程&#xff0c;通过模拟数据集进行训练和优化&#xff0c;训练目标是使模型能够根据输入特征正确分类数据。 演示: 1.通过PyTorch生成了一个模拟的二分类数据集&#xff0c;包括特征矩阵data_x和对应的标签数据data_y。标签…

加密与安全_AES RSA 密钥对生成及PEM格式的代码实现

文章目录 RSA&#xff08;非对称&#xff09;和AES&#xff08;对称&#xff09;加密算法一、RSA&#xff08;Rivest-Shamir-Adleman&#xff09;二、AES&#xff08;Advanced Encryption Standard&#xff09; RSA加密三种填充模式一、RSA填充模式二、常见的RSA填充模式组合三…

新业务 新市场 | 灵途科技新品亮相马来西亚亚洲防务展

5月6日&#xff0c;灵途科技携新品模组与武汉长盈通光电&#xff08;股票代码&#xff1a;688143&#xff09;携手参加第18届马来西亚亚洲防务展。首次亮相海外&#xff0c;灵途科技便收获全球客户的广泛关注&#xff0c;为公司海外市场开拓打下坚实基础。 灵途科技与长盈通共同…

Dbs封装_连接池

1.Dbs封装 每一个数据库都对应着一个dao 每个dao势必存在公共部分 我们需要将公共部分抽取出来 封装成一个工具类 保留个性化代码即可 我们的工具类一般命名为xxxs 比如Strings 就是字符串相关的工具类 而工具类 我们将其放置于util包中我们以是否有<T>区分泛型方法和非泛…

Python并发编程学习记录

1、初识并发编程 1.1、串行&#xff0c;并行&#xff0c;并发 串行(serial)&#xff1a;一个cpu上按顺序完成多个任务&#xff1b; 并行(parallelism)&#xff1a;任务数小于或等于cup核数&#xff0c;多个任务是同时执行的&#xff1b; 并发(concurrency)&#xff1a;一个…

计算机SCI期刊,IF=8+,专业性强,潜力新刊!

一、期刊名称 Journal of Big data 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;8.1 中科院分区&#xff1a;2区 出版方式&#xff1a;开放出版 版面费&#xff1a;$1990 三、期刊征稿范围 《大数据杂志》发表了关于…

2024年【T电梯修理】考试内容及T电梯修理新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【T电梯修理】考试内容及T电梯修理新版试题&#xff0c;包含T电梯修理考试内容答案和解析及T电梯修理新版试题练习。安全生产模拟考试一点通结合国家T电梯修理考试最新大纲及T电梯修理考试真题汇总&#xff0c;…

线性dp合集,蓝桥杯

贸易航线 0贸易航线 - 蓝桥云课 (lanqiao.cn) n,m,kmap(int ,input().split()) #贪心的想&#xff0c;如果买某个东西利润最大&#xff0c;那我肯定直接拉满啊&#xff0c;所以买k个和买一个没区别 p[0] for i in range(n):p.append([-1]list(map(int,input().split())))dp[[…

(2024,SDE,对抗薛定谔桥匹配,离散时间迭代马尔可夫拟合,去噪扩散 GAN)

Adversarial Schrdinger Bridge Matching 公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 4. 实验 0. 摘要 薛定谔桥&#xff08;Schrdinger Bridge&#xff0c;SB&…

el-autocomplete后台远程搜索

el-complete可以实现后台远程搜索功能&#xff0c;但有时传入数据为空时&#xff0c;接口可能会报错。此时可在querySearchAsync方法中&#xff0c;根据queryString判断&#xff0c;若为空&#xff0c;则不掉用接口&#xff0c;直接callback([])&#xff0c;反之则调用接口&…