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
英文地址,請注明出處:http://en.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;反之則調用接口&…