博主介紹:?全網粉絲50W+,前互聯網大廠軟件研發、集結碩博英豪成立軟件開發工作室,專注于計算機相關專業項目實戰6年之久,累計開發項目作品上萬套。憑借豐富的經驗與專業實力,已幫助成千上萬的學生順利畢業,選擇我們,就是選擇放心、選擇安心畢業?
> 🍅想要獲取完整文章或者源碼,或者代做,拉到文章底部即可與我聯系了。🍅點擊查看作者主頁,了解更多項目!
🍅感興趣的可以先收藏起來,點贊、關注不迷路,大家在畢設選題,項目以及論文編寫等相關問題都可以給我留言咨詢,希望幫助同學們順利畢業?。🍅
1、畢業設計:2025年計算機專業畢業設計選題匯總(建議收藏)?
2、最全計算機專業畢業設計選題大全(建議收藏)?
1、項目介紹
技術棧:Python語言、YOLOv8、深度學習模型、PySide圖形界面、智慧交通、車流實時檢測系統
智慧交通車流實時檢測系統-深度學習
2、項目界面
(1)車流量實時檢測監控,實時流量檢測折線圖
(2)車流量軌跡實時跟蹤
(3)數據監控大屏,大屏數據展示
(4)車流量檢測識別記錄
(5)車流量檢測識別2
(6)檢測識別結果
(7)登錄界面
3、項目說明
技術棧:Python語言、YOLOv8、深度學習模型、PySide圖形界面、智慧交通、車流實時檢測系統
智慧交通車流實時檢測系統-深度學習
(一)基本內容
智慧交通車流量檢測系統是針對城市交通管理和規劃而開發的一種技術應用。隨著城市化進程的加快,城市交通問題日益突出,如交通擁堵、交通事故頻發等。為了解決這些問題,智慧交通系統應運而生。車流量檢測是智慧交通系統的一個重要組成部分。通過對交通流的實時監測和分析,可以及時發現交通擁堵、交通事故等問題,并采取相應的措施進行調整和處理。
YOLOv8算法是一種目標檢測算法,能夠快速高效地對圖像中的物體進行檢測和識別。在智慧交通車流量檢測系統中,可以利用YOLOv8算法對交通流中的車輛進行實時檢測和計數,從而獲取車流量的信息。Python語言是一種簡單易學、功能強大的編程語言,具有豐富的第三方庫和工具,適合進行數據處理和算法實現。在智慧交通車流量檢測系統中,可以使用Python語言編寫相關的算法和程序,實現對車流量的檢測和統計。PySide圖形界面是Python的一個GUI開發框架,可以實現用戶友好的交互界面。在智慧交通車流量檢測系統中,可以使用PySide框架搭建用戶界面,方便用戶進行系統的配置和操作。
智慧交通車流量檢測系統的研究背景是基于城市交通管理和規劃的需求,利用先進的信息技術和算法,對交通流進行實時監測和管理,以提高交通效率和安全性。技術棧包括Python語言、YOLOv8算法、PySide圖形界面等。
(二)擬解決的主要問題
智慧交通車流量檢測系統的研究背景是基于城市交通管理和規劃的需求,利用先進的信息技術和算法,對交通流進行實時監測和管理,以提高交通效率和安全性。技術棧包括Python語言、YOLOv8算法、PySide圖形界面等。
4、核心代碼
# -*- coding: utf-8 -*-# @Description : python main.pyfrom PySide6.QtWidgets import QApplication, QMainWindow, QFileDialog, QMenu
from PySide6.QtGui import QImage, QPixmap, QColor,QCursor
from PySide6.QtCore import QTimer, QThread, Signal, QObject, Qtfrom ui.main_window import Ui_MainWindow
from ui.pop.pop_box import MessageBox
from ui.ui_function import *
from ui.toast.toast import DialogOver
from ui.dialog.rtsp_win import Window
from ui.dialog.id_win import id_Windowfrom utils.main_utils import check_url, check_path
from utils.AtestCamera import Camera
from classes.yolo import YoloPredictor
from classes.main_config import MainConfig
from classes.car_chart import WorkerThreadfrom PIL import Image
import numpy as np
import supervision as sv
import subprocess
import sys
import cv2
import os
import datetimeclass MainWindow(QMainWindow, Ui_MainWindow):# 主窗口向yolo實例發送執行信號main2yolo_begin_sgl = Signal()def __init__(self, parent=None):super(MainWindow, self).__init__()self.setupUi(self)# 背景設置為半透明 & 無邊框窗口self.setAttribute(Qt.WA_TranslucentBackground) self.setWindowFlags(Qt.FramelessWindowHint)# UI動作(動效)UIFuncitons.uiDefinitions(self)# 變量設置self.car_threshold = 0 # 車輛閾值self.web_flag = True # 可以開啟self.server_process = None # 服務器進程self.image_id = 0 # 圖片 idself.txt_id = 0 # 標簽 id# 設置陰影UIFuncitons.shadow_style(self, self.Class_QF, QColor(162,129,247))UIFuncitons.shadow_style(self, self.Target_QF, QColor(251, 157, 139))UIFuncitons.shadow_style(self, self.Fps_QF, QColor(170, 128, 213))UIFuncitons.shadow_style(self, self.Model_QF, QColor(64, 186, 193))# 設置 為 -- (好看)self.Class_num.setText('--')self.Target_num.setText('--')self.fps_label.setText('--')# 計時器:每2秒監視模型文件更改一次self.Qtimer_ModelBox = QTimer(self)self.Qtimer_ModelBox.timeout.connect(self.ModelBoxRefre)self.Qtimer_ModelBox.start(2000)self.yolo_init() # 實例化YOLOself.model_bind() # 預測參數-數值變動綁定 主頁面# 主要功能綁定 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@self.main_function_bind()self.load_config() # 配置加載self.model_load() # 模型加載# 畫圖線程self.is_draw_thread = Falseself.draw_thread = WorkerThread()self.show_status('歡迎使用智能車流分析系統!')# 實例化YOLOdef yolo_init(self):# Yolo-v8 threadself.yolo_predict = YoloPredictor() #實例化yolo檢測self.select_model = self.model_box.currentText()self.yolo_thread = QThread()# 顯示預測視頻(左,右)self.yolo_predict.yolo2main_trail_img.connect(lambda x: self.show_image(x, self.pre_video))self.yolo_predict.yolo2main_box_img.connect(lambda x: self.show_image(x, self.res_video))# 輸出信息、FPS、類數、總數self.yolo_predict.yolo2main_status_msg.connect(lambda x: self.show_status(x))self.yolo_predict.yolo2main_fps.connect(lambda x: self.fps_label.setText(x))self.yolo_predict.yolo2main_class_num.connect(lambda x:self.Class_num.setText(str(x)))self.yolo_predict.yolo2main_progress.connect(lambda x: self.progress_bar.setValue(x))# 移動線程里面去(通過main2yolo_begin_sgl信號控制-先要開啟yolo_thread線程,才能啟動yolo_predict的run方法)self.yolo_predict.moveToThread(self.yolo_thread)self.main2yolo_begin_sgl.connect(self.yolo_predict.run)# 顯示總車流量self.yolo_predict.yolo2main_target_num.connect(lambda x:self.Target_setText(x))# 模型加載def model_load(self):# 創建模型文件夾check_path(self.config.models_path)self.model_box.clear()self.pt_list = os.listdir(f'./{self.config.models_path}')self.pt_list = [file for file in self.pt_list if file.endswith('.pt') or file.endswith('.engine')]self.pt_list.sort(key=lambda x: os.path.getsize(f'./{self.config.models_path}/' + x)) #按文件大小排序self.model_box.clear()self.model_box.addItems(self.pt_list)# 主頁面各功能綁定def main_function_bind(self):self.src_file_button.clicked.connect(self.open_src_file) # 打開文件夾self.src_cam_button.clicked.connect(self.camera_select) # 攝像頭# self.src_rtsp_button.clicked.connect(self.rtsp_seletction) # RTPSself.src_graph_button.clicked.connect(self.show_traffic_graph) # 流量圖self.src_lock_button.clicked.connect(self.lock_id_selection) # 單目追蹤# self.src_web_button.clicked.connect(self.web_back_end) # 后端開啟與關閉self.run_button.clicked.connect(self.run_or_continue) # 開始self.stop_button.clicked.connect(self.stop) # 終止self.save_res_button.toggled.connect(self.is_save_res) # 是否 保存 視頻self.save_txt_button.toggled.connect(self.is_save_txt) # 是否 保存 標簽self.show_labels_checkbox.toggled.connect(self.is_show_labels) # 是否 顯示標簽self.show_trace_checkbox.toggled.connect(self.is_show_trace) # 是否 顯示軌跡self.ToggleBotton.clicked.connect(lambda: UIFuncitons.toggleMenu(self, True))self.settings_button.clicked.connect(lambda: UIFuncitons.settingBox(self, True))# 模型參數綁定def model_bind(self):self.model_box.currentTextChanged.connect(self.change_model)self.iou_spinbox.valueChanged.connect(lambda x:self.change_val(x, 'iou_spinbox')) # iou boxself.iou_slider.valueChanged.connect(lambda x:self.change_val(x, 'iou_slider')) # iou scroll barself.conf_spinbox.valueChanged.connect(lambda x:self.change_val(x, 'conf_spinbox')) # conf boxself.conf_slider.valueChanged.connect(lambda x:self.change_val(x, 'conf_slider')) # conf scroll barself.speed_spinbox.valueChanged.connect(lambda x:self.change_val(x, 'speed_spinbox'))# speed boxself.speed_slider.valueChanged.connect(lambda x:self.change_val(x, 'speed_slider')) # speed scroll barself.speed_sss.valueChanged.connect(lambda x: self.change_val(x, 'speed_sss')) # speed boxself.speed_nnn.valueChanged.connect(lambda x:self.change_val(x, 'speed_nnn')) # speed scroll bar# JSON配置文件初始化def load_config(self):self.config = MainConfig("./config/config.json")self.save_res_button.setChecked(self.config.save_res)self.save_txt_button.setChecked(self.config.save_txt)self.iou_slider.setValue(self.config.iou * 100)self.conf_slider.setValue(self.config.conf * 100)self.speed_slider.setValue(self.config.rate)self.speed_sss.setValue(self.config.car_threshold)self.yolo_predict.save_txt = self.config.save_txt # 保存標簽self.yolo_predict.save_res = self.config.save_res # 保存結果self.yolo_predict.save_txt_path = self.config.save_txt_pathself.yolo_predict.save_res_path = self.config.save_res_pathself.yolo_predict.new_model_name = f"./{self.config.models_path}/%s" % self.select_modelself.yolo_predict.show_trace = self.config.show_trace # 軌跡self.show_trace_checkbox.setChecked(self.config.show_trace) # 軌跡self.yolo_predict.show_labels = self.config.show_labels # 標簽self.show_labels_checkbox.setChecked(self.config.show_labels) # 標簽self.open_fold = self.config.open_foldself.rtsp_ip = self.config.rtsp_ipself.car_id = self.config.car_idself.run_button.setChecked(False)# 如果超出了車流閾值,那么就變紅!!def Target_setText(self, num):num = str(num)self.Target_num.setText(num)self.char_label.setText(f"當前車流量: {num}")if (int(num) > int(self.car_threshold)):self.char_label.setStyleSheet("color: red;")else:self.char_label.setStyleSheet("color: green;")#主窗口顯示軌跡圖像和檢測圖像 (縮放在這里)@staticmethoddef show_image(img_src, label):try:# 檢查圖像的通道數,確定圖像是否為彩色圖像if len(img_src.shape) == 3:ih, iw, _ = img_src.shapeif len(img_src.shape) == 2:ih, iw = img_src.shape# 根據標簽窗口的大小調整圖像的大小w = label.geometry().width()h = label.geometry().height()# 根據圖像寬高比例進行縮放if iw / w > ih / h:scal = w / iwnw = wnh = int(scal * ih)img_src_ = cv2.resize(img_src, (nw, nh))else:scal = h / ihnw = int(scal * iw)nh = himg_src_ = cv2.resize(img_src, (nw, nh))# 將OpenCV圖像從BGR格式轉換為RGB格式,并創建QImage對象frame = cv2.cvtColor(img_src_, cv2.COLOR_BGR2RGB)img = QImage(frame.data, frame.shape[1], frame.shape[0], frame.shape[2] * frame.shape[1],QImage.Format_RGB888)# 在標簽窗口中顯示圖像label.setPixmap(QPixmap.fromImage(img))except Exception as e:print(repr(e))#控制開始|暫停def run_or_continue(self):# 檢測是否有模型if self.yolo_predict.new_model_name == '' or self.yolo_predict.new_model_name == None:DialogOver(parent=self, text="請檢測模型", title="運行失敗", flags="danger")self.run_button.setChecked(False)return# 檢測輸入源if self.yolo_predict.source == '' or self.yolo_predict.source == None:self.show_status('請在檢測前選擇輸入源...')self.run_button.setChecked(False)DialogOver(parent=self, text="請檢測輸入源", title="運行失敗", flags="danger")returnself.yolo_predict.stop_dtc = False # 線程開始# 開始if self.run_button.isChecked():# 圖片預測file_extension = self.yolo_predict.source[-3:].lower()if file_extension == 'png' or file_extension == 'jpg':self.img_predict()return# 視頻預測DialogOver(parent=self, text="開始檢測...", title="運行成功", flags="success")self.run_button.setChecked(True)self.draw_thread.run_continue() # 折線圖開始# 不可再改變設置(config動態調整 關閉)self.save_txt_button.setEnabled(False)self.save_res_button.setEnabled(False)self.conf_slider.setEnabled(False)self.iou_slider.setEnabled(False)self.speed_slider.setEnabled(False)self.show_status('檢測中...')if '0' in self.yolo_predict.source or 'rtsp' in self.yolo_predict.source:self.progress_bar.setFormat('實時視頻流檢測中...')if 'avi' in self.yolo_predict.source or 'mp4' in self.yolo_predict.source:self.progress_bar.setFormat("當前檢測進度:%p%")self.yolo_predict.continue_dtc = True# 開始檢測if not self.yolo_thread.isRunning():self.yolo_thread.start()self.main2yolo_begin_sgl.emit()# 暫停else:self.draw_thread.pause() # 折線圖暫停self.yolo_predict.continue_dtc = Falseself.show_status("暫停...")DialogOver(parent=self, text="已暫停檢測", title="運行暫停", flags="warning")self.run_button.setChecked(False)# 顯示狀態 (底部欄def show_status(self, msg):self.status_bar.setText(msg) # 顯示輸出if msg == '檢測完成':self.save_res_button.setEnabled(True)self.save_txt_button.setEnabled(True)self.run_button.setChecked(False) self.progress_bar.setValue(0)# 終止yolo線程if self.yolo_thread.isRunning():self.yolo_thread.quit()# 修改畫圖線程狀態self.draw_thread.stop()self.is_draw_thread = Falseelif msg == '檢測終止':self.save_res_button.setEnabled(True)self.save_txt_button.setEnabled(True)self.run_button.setChecked(False) self.progress_bar.setValue(0)# 終止yolo線程if self.yolo_thread.isRunning():self.yolo_thread.quit()# 修改畫圖線程狀態self.draw_thread.stop()self.is_draw_thread = Falseself.pre_video.clear() self.res_video.clear() self.Class_num.setText('--')self.Target_num.setText('--')self.fps_label.setText('--')# 打開文件def open_src_file(self):name, _ = QFileDialog.getOpenFileName(self, 'Video/image', self.open_fold, "Pic File(*.mp4 *.mkv *.avi *.flv *.jpg *.png)")if name:self.yolo_predict.source = nameself.show_status('加載文件:{}'.format(os.path.basename(name)))self.open_fold = os.path.dirname(name)# 終止事件self.stop()DialogOver(parent=self, text=f"文件路徑: {name}", title="加載成功", flags="success")# camera選擇def camera_select(self):#try:# 關閉YOLO線程self.stop()#獲取本地攝像頭數量_, cams = Camera().get_cam_num()popMenu = QMenu()popMenu.setFixedWidth(self.src_cam_button.width())popMenu.setStyleSheet('''QMenu {font-size: 20px;font-family: "Microsoft YaHei UI";font-weight: light;color:white;padding-left: 5px;padding-right: 5px;padding-top: 4px;padding-bottom: 4px;border-style: solid;border-width: 0px;border-color: rgba(255, 212, 255, 255);border-radius: 3px;background-color: rgba(16,155,226,50);}''')for cam in cams:exec("action_%s = QAction('%s 號攝像頭')" % (cam, cam))exec("popMenu.addAction(action_%s)" % cam)pos = QCursor.pos()action = popMenu.exec(pos)# 設置攝像頭來源if action:str_temp = ''selected_stream_source = str_temp.join(filter(str.isdigit, action.text())) #獲取攝像頭號,去除非數字字符self.yolo_predict.source = selected_stream_sourceself.show_status(f'攝像頭設備:{action.text()}')DialogOver(parent=self, text=f"當前攝像頭為: {action.text()}", title="攝像頭選擇成功", flags="success")# 1、選擇rtspdef rtsp_seletction(self):self.rtsp_window = Window()self.rtsp_window.rtspEdit.setText(self.rtsp_ip)self.rtsp_window.show()# 如果點擊則加載RTSPself.rtsp_window.rtspButton.clicked.connect(lambda: self.load_rtsp(self.rtsp_window.rtspEdit.text()))# 2、加載RTSPdef load_rtsp(self, ip):MessageBox(self.close_button, title='提示', text='加載 rtsp...', time=1000, auto=True).exec()self.stop() # 關閉YOLO線程self.yolo_predict.source = ipself.rtsp_ip = ip # 寫會ipself.rtsp_window.close()#狀態顯示self.show_status(f'加載rtsp地址:{ip}')DialogOver(parent=self, text=f"rtsp地址為: {ip}", title="RTSP加載成功", flags="success")# 1、設置 單目標def lock_id_selection(self):self.yolo_predict.lock_id = Noneself.id_window = id_Window()self.id_window.idEdit.setText(str(self.car_id))self.id_window.show()self.id_window.idButton.clicked.connect(lambda: self.set_lock_id(self.id_window.idEdit.text()))# 2、設置 單目標 IDdef set_lock_id(self,lock_id):self.yolo_predict.lock_id = Noneself.yolo_predict.lock_id = lock_idself.car_id = lock_id # 寫回lock_idself.show_status('加載ID:{}'.format(lock_id))self.id_window.close()#加載流量折線圖def show_traffic_graph(self):# 沒有開始檢測if not self.run_button.isChecked():DialogOver(parent=self, text="請先開始目標檢測!", title="開啟失敗", flags="danger")return# 避免重復開啟if self.is_draw_thread:DialogOver(parent=self, text="流量圖已經開啟啦!", title="不能重復開啟", flags="danger")returnself.draw_thread.start()self.is_draw_thread = True# 開啟Web后端def web_back_end(self):# 終止事件self.stop()base_dir = os.path.dirname(os.path.abspath(__file__))flask_app_path = os.path.join(base_dir, 'app.py')# True是可以開啟# if (self.web_flag):# self.server_process = subprocess.Popen(['python', flask_app_path])# MessageBox(self.close_button, title='提示', text='正在開啟網頁端...', time=2000, auto=True).exec()## # 檢查子進程是否啟動# try:# if self.server_process.pid is not None:# self.src_web_button.setText("關閉網頁端")# self.web_flag = False# DialogOver(parent=self, text="網頁端已開啟", title="開啟成功", flags="success")# except Exception as e:# DialogOver(parent=self, text=str(e), title="開啟失敗", flags="danger")### # False是關閉后端# else:# try:# self.server_process.terminate()# MessageBox(self.close_button, title='提示', text='正在關閉網頁端...', time=2000, auto=True).exec()## self.src_web_button.setText("開啟網頁端")# self.web_flag = True# DialogOver(parent=self, text="網頁端已關閉", title="關閉成功", flags="success")# except Exception as e:# DialogOver(parent=self, text=str(e), title="關閉失敗", flags="danger")#保存提示(MP4)def is_save_res(self):if self.save_res_button.checkState() == Qt.CheckState.Unchecked:self.show_status('提示: 監測結果不會被保存')self.yolo_predict.save_res = Falseelif self.save_res_button.checkState() == Qt.CheckState.Checked:self.show_status('提示: 監測結果將會被保存')self.yolo_predict.save_res = True#保存提示(txt)def is_save_txt(self):if self.save_txt_button.checkState() == Qt.CheckState.Unchecked:self.show_status('提示: 標簽信息不會被保存')self.yolo_predict.save_txt = Falseelif self.save_txt_button.checkState() == Qt.CheckState.Checked:self.show_status('提示: 標簽信息將會被保存')self.yolo_predict.save_txt = True# 是否顯示 標簽def is_show_labels(self):if self.show_labels_checkbox.checkState() == Qt.CheckState.Unchecked:self.yolo_predict.show_labels = Falseself.show_status('提示: 不再顯示標簽')elif self.show_labels_checkbox.checkState() == Qt.CheckState.Checked:self.yolo_predict.show_labels = Trueself.show_status('提示: 顯示標簽')# 是否顯示 軌跡def is_show_trace(self):if self.show_trace_checkbox.checkState() == Qt.CheckState.Unchecked:self.yolo_predict.show_trace = Falseself.show_status('提示: 不再顯示軌跡')elif self.show_trace_checkbox.checkState() == Qt.CheckState.Checked:self.yolo_predict.show_trace = Trueself.show_status('提示: 顯示軌跡')#終止事件(按下終止按鈕 or 輸入源更換的時候)def stop(self):try:# 攝像頭釋放self.yolo_predict.release_capture() # 這里是為了終止使用攝像頭檢測函數的線程,改了yolo源碼# 結束線程self.yolo_thread.quit()except:passself.yolo_predict.stop_dtc = Trueself.run_button.setChecked(False) #恢復按鈕狀態# 終止后才可以修改設置self.save_res_button.setEnabled(True) #把保存按鈕設置為可用self.save_txt_button.setEnabled(True) #把保存按鈕設置為可用self.iou_slider.setEnabled(True) #把滑塊設置為可用self.conf_slider.setEnabled(True) #把滑塊設置為可用self.speed_slider.setEnabled(True) #把滑塊設置為可用self.pre_video.clear() #清空視頻顯示self.res_video.clear() #清空視頻顯示self.progress_bar.setValue(0) #進度條清零self.Class_num.setText('--')self.Target_num.setText('--')self.fps_label.setText('--')#檢測參數設置def change_val(self, x, flag):# 交互比if flag == 'iou_spinbox':self.iou_slider.setValue(int(x*100)) elif flag == 'iou_slider':self.iou_spinbox.setValue(x/100) self.show_status('IOU Threshold: %s' % str(x/100))self.yolo_predict.iou_thres = x/100# 置信度elif flag == 'conf_spinbox':self.conf_slider.setValue(int(x*100))elif flag == 'conf_slider':self.conf_spinbox.setValue(x/100)self.show_status('Conf Threshold: %s' % str(x/100))self.yolo_predict.conf_thres = x/100# 延時elif flag == 'speed_spinbox':self.speed_slider.setValue(x)elif flag == 'speed_slider':self.speed_spinbox.setValue(x)self.show_status('Delay: %s ms' % str(x))self.yolo_predict.speed_thres = x # ms# 車輛數預測警報elif flag == 'speed_nnn':self.speed_sss.setValue(x)elif flag == 'speed_sss':self.speed_nnn.setValue(x)self.show_status('流量閾值設置: %s 輛' % str(x))self.car_threshold = x # ms#模型更換def change_model(self,x):self.select_model = self.model_box.currentText()self.yolo_predict.new_model_name = f"./{self.config.models_path}/%s" % self.select_modelself.show_status('更改模型:%s' % self.select_model)self.Model_name.setText(self.select_model)#循環監測文件夾的文件變化def ModelBoxRefre(self):pt_list = os.listdir(f'./{self.config.models_path}')pt_list = [file for file in pt_list if file.endswith('.pt') or file.endswith('.engine')]pt_list.sort(key=lambda x: os.path.getsize(f'./{self.config.models_path}/' + x))#必須排序后再比較,否則列表會一直刷新if pt_list != self.pt_list:self.pt_list = pt_listself.model_box.clear()self.model_box.addItems(self.pt_list)#獲取鼠標位置(用于按住標題欄拖動窗口)def mousePressEvent(self, event):p = event.globalPosition()globalPos = p.toPoint()self.dragPos = globalPos#拖動窗口大小時優化調整def resizeEvent(self, event):# Update Size GripsUIFuncitons.resize_grips(self)# 退出時退出線程,保存設置def closeEvent(self, event):try:self.stop()# 檢測畫圖線程self.draw_thread.close_exec()# self.draw_thread.deleteLater()# config.jsonself.config.save_res = self.yolo_predict.save_resself.config.save_txt = self.yolo_predict.save_txtself.config.show_labels = self.yolo_predict.show_labelsself.config.show_trace = self.yolo_predict.show_traceself.config.iou = self.yolo_predict.iou_thresself.config.conf = self.yolo_predict.conf_thresself.config.rate = self.yolo_predict.speed_thresself.config.car_threshold = self.car_threshold # 車輛警報 閾值self.config.rtsp_ip = self.rtsp_ipself.config.car_id = self.car_idself.config.open_fold = self.open_foldself.config.save_config() # 保存設置# 退出彈窗 2sMessageBox(self.close_button, title='Note', text='退出中,請等待...', time=2000, auto=True).exec()# 檢查服務器進程是否啟動if self.server_process is not None:if self.server_process.pid is not None:self.server_process.terminate() # 服務器進程關閉sys.exit(0)except Exception as e:print(e)sys.exit(0)# 預測圖片def img_predict(self):if check_url(self.yolo_predict.source):DialogOver(parent=self, text="目標路徑含有中文!", title="程序取消", flags="danger")returnself.run_button.setChecked(False) # 按鈕# 讀取照片image = cv2.imread(self.yolo_predict.source)org_img = image.copy()# 加載模型model = self.yolo_predict.load_yolo_model()# 獲取數據源iter_model = iter(model.track(source=image, show=False))result = next(iter_model) # 這里是檢測的核心,# 如果沒有目標if result.boxes.id is None:DialogOver(parent=self, text="該圖片中沒有要檢測的目標喲!", title="運行完成", flags="warning")self.show_image(image, self.pre_video)self.show_image(image, self.res_video)self.yolo_predict.source = ''return# 如果有目標detections = sv.Detections.from_yolov8(result)detections.tracker_id = result.boxes.id.cpu().numpy().astype(int)# 畫標簽labels_write, img_box = self.yolo_predict.creat_labels(detections, image, model)# 顯示信息 —— 類別數 & 總數self.Class_num.setText(str(self.yolo_predict.get_class_number(detections)))self.Target_num.setText(str(len(detections.tracker_id)))# 顯示圖片self.show_image(org_img, self.pre_video) # leftself.show_image(img_box, self.res_video) # rightself.yolo_predict.source = ''DialogOver(parent=self, text="圖片檢測完成", title="運行成功", flags="success")# 保存圖片if self.yolo_predict.save_res:check_path(self.config.save_res_path) # 檢查保存路徑# 存在同名文件,自增 self.image_id 直至文件不存在while os.path.exists(f"{self.config.save_res_path}/image_result_{self.image_id}.jpg"):self.image_id += 1# 將 BGR 格式的 frame 轉換為 RGB 格式rgb_frame = cv2.cvtColor(img_box, cv2.COLOR_BGR2RGB)# 把 rgb_frame 轉換為 numpy格式 就行了numpy_frame = np.array(rgb_frame)Image.fromarray(numpy_frame).save(f"./{self.config.save_res_path}/image_result_{self.image_id}.jpg")# 存儲labels里的信息if self.yolo_predict.save_txt:check_path(self.config.save_txt_path) # 檢查保存路徑# 存在同名文件,自增 self.txt_id 直至文件不存在while os.path.exists(f"{self.config.save_txt_path}/result_{self.txt_id}.jpg"):self.txt_id += 1with open(f'{self.config.save_txt_path}/result_{self.txt_id}.txt', 'a') as f:f.write('當前時刻屏幕信息:' +str(labels_write) +f'檢測時間: {datetime.datetime.now().strftime("%Y-%m-%d-%H:%M:%S")}' +f' 路段通過的目標總數: {len(detections.tracker_id)}')f.write('\n')returnif __name__ == "__main__":app = QApplication(sys.argv)Home = MainWindow()Home.show()sys.exit(app.exec())
🍅?感興趣的可以先收藏起來,點贊關注不迷路,想學習更多項目可以查看主頁,大家在畢設選題,項目編程以及論文編寫等相關問題都可以給我留言咨詢,希望可以幫助同學們順利畢業!🍅?
5、源碼獲取方式
🍅由于篇幅限制,獲取完整文章或源碼、代做項目的,拉到文章底部即可看到個人聯系方式。🍅
點贊、收藏、關注,不迷路,下方查看👇🏻獲取聯系方式👇🏻