使用python進行人員軌跡跟蹤

一、系統概述

該系統基于計算機視覺技術,實現對視頻或攝像頭畫面中的人員進行檢測、跟蹤,并生成軌跡數據。支持透視變換校準(鳥瞰圖顯示)、多目標跟蹤、軌跡存儲及視頻錄制功能,適用于安防監控、行為分析等場景。

二、依賴庫

python

運行

import cv2         # 計算機視覺處理(OpenCV庫)
import numpy as np # 數值計算
import time        # 時間處理
import os          # 文件與目錄操作
from datetime import datetime # 日期時間處理

三、類定義:PersonTracker

3.1 構造函數?__init__

功能

初始化人員跟蹤器,配置視頻源、輸出參數、背景減除器及跟蹤參數。

參數說明
參數名類型默認值描述
video_sourceint/str0視頻源(0為默認攝像頭,或指定視頻文件路徑)
save_videoboolFalse是否保存處理后的視頻
show_warpedboolTrue是否顯示透視變換后的鳥瞰圖
內部屬性
  • 視頻源與基礎參數
    • cap:視頻捕獲對象(cv2.VideoCapture實例)
    • frame_width/frame_height:視頻幀寬高
    • fps:幀率
  • 輸出配置
    • output_folder:輸出文件夾(默認output
    • out:視頻寫入對象(cv2.VideoWriter實例,僅當save_video=True時創建)
  • 背景減除
    • fgbg:使用MOG2算法的背景減除器,支持陰影檢測
  • 跟蹤參數
    • min_contour_area/max_contour_area:過濾輪廓的面積閾值(單位像素)
    • trajectories:存儲軌跡的字典(鍵為人員 ID,值為軌跡信息)
    • max_disappeared_frames:允許目標消失的最大幀數(超過則刪除軌跡)
    • max_distance:軌跡匹配的最大距離(像素)
  • 透視變換
    • perspective_transform:透視變換矩陣(校準后生成)
    • warped_width/warped_height:鳥瞰圖尺寸(寬度固定 500,高度與原始幀一致)

3.2 方法列表

3.2.1?calibrate_perspective()
  • 功能:通過鼠標點擊選擇 4 個點,校準透視變換矩陣,生成鳥瞰圖。
  • 操作說明
    1. 顯示視頻第一幀,按順序點擊左上、右上、右下、左下四個點,形成矩形區域。
    2. q鍵退出校準。
  • 返回值boolTrue為校準成功,False為取消或失敗)
3.2.2?detect_persons(frame)
  • 功能:在輸入幀中檢測人員,返回檢測結果和二值化掩碼。
  • 輸入frame(BGR 格式圖像)
  • 處理流程
    1. 應用背景減除,生成前景掩碼。
    2. 形態學操作(開運算 + 閉運算)去除噪聲。
    3. 查找輪廓,過濾面積不符合閾值的輪廓。
    4. 計算每個輪廓的中心點和邊界框。
  • 返回值(persons, thresh),其中:
    • persons:檢測到的人員列表(每個元素為字典,包含bboxcentercontourarea
    • thresh:二值化掩碼圖像
3.2.3?track_persons(detected_persons)
  • 功能:根據檢測結果更新人員軌跡。
  • 輸入detected_personsdetect_persons返回的人員列表)
  • 算法邏輯
    1. 計算現有軌跡與新檢測的匹配距離(歐氏距離),優先匹配近距離目標。
    2. 未匹配的軌跡:若連續消失超過max_disappeared_frames,則刪除。
    3. 未匹配的檢測:創建新軌跡,分配唯一 ID。
3.2.4?draw_results(frame, persons, thresh)
  • 功能:在圖像上繪制檢測框、軌跡、ID 及統計信息,支持鳥瞰圖顯示。
  • 輸入
    • frame:原始幀
    • persons:檢測到的人員列表
    • thresh:二值化掩碼(未使用,僅保留接口)
  • 輸出:繪制后的結果圖像(若show_warped=True,則為原始幀與鳥瞰圖的橫向拼接圖)
3.2.5?save_trajectories()
  • 功能:將當前所有軌跡數據保存到文本文件,包含 ID、起始時間、軌跡點坐標等。
  • 存儲路徑output_folder/trajectories_時間戳.txt
3.2.6?run()
  • 功能:運行跟蹤主循環,處理視頻流并實時顯示結果。
  • 操作說明
    • q鍵退出程序。
    • s鍵保存當前軌跡數據。
  • 流程
    1. 調用calibrate_perspective()進行透視校準(可選)。
    2. 逐幀讀取視頻,檢測、跟蹤人員,繪制結果。
    3. 釋放資源并關閉窗口。

四、主程序入口

python

運行

if __name__ == "__main__":tracker = PersonTracker(video_source=0,       # 0為攝像頭,或指定視頻文件路徑(如"video.mp4")save_video=True,      # 啟用視頻錄制show_warped=True      # 顯示鳥瞰圖)tracker.run()

五、使用說明

5.1 環境配置

  1. 安裝依賴庫:

    bash

    pip install opencv-python numpy
    
  2. 確保攝像頭或視頻文件可用。

5.2 透視校準操作

  1. 運行程序后,會彈出窗口提示選擇 4 個點。
  2. 按順序點擊視頻中的矩形區域四角(如地面區域),生成鳥瞰圖。
  3. 校準完成后,右側會顯示鳥瞰圖中的軌跡。

5.3 輸出文件

  • 視頻文件:若save_video=True,生成output/tracking_時間戳.avi
  • 軌跡文件:按s鍵生成output/trajectories_時間戳.txt,包含各 ID 的坐標序列。

六、參數調整建議

參數名作用調整場景
min_contour_area過濾小目標(如噪聲)目標較小時調小,反之調大
max_contour_area過濾大目標(如多人重疊)目標較大時調大,反之調小
max_disappeared_frames目標消失后保留軌跡的幀數目標運動間隔較長時調大
max_distance軌跡匹配的最大允許距離目標運動速度快時調大
warped_width鳥瞰圖寬度顯示區域寬窄調整

七、注意事項

  1. 背景減除器MOG2需要一定時間學習背景(前幾秒可能檢測不穩定)。
  2. 透視校準的四點應選擇實際場景中的矩形區域(如地面邊框),以確保鳥瞰圖坐標準確。
  3. 若視頻幀率較低,可嘗試降低warped_width或關閉show_warped以減少計算量。

完成代碼

import cv2
import numpy as np
import time
import os
from datetime import datetimeclass PersonTracker:def __init__(self, video_source=0, save_video=False, show_warped=True):"""初始化人員跟蹤器"""# 視頻源設置self.video_source = video_sourceself.cap = cv2.VideoCapture(video_source)if not self.cap.isOpened():raise ValueError("無法打開視頻源", video_source)# 獲取視頻的寬度、高度和幀率self.frame_width = int(self.cap.get(3))self.frame_height = int(self.cap.get(4))self.fps = self.cap.get(cv2.CAP_PROP_FPS)# 輸出設置self.save_video = save_videoself.output_folder = "output"self.show_warped = show_warped# 創建輸出文件夾if not os.path.exists(self.output_folder):os.makedirs(self.output_folder)# 背景減除器self.fgbg = cv2.createBackgroundSubtractorMOG2(history=500, varThreshold=100, detectShadows=True)# 人員檢測參數self.min_contour_area = 1000  # 最小輪廓面積self.max_contour_area = 50000  # 最大輪廓面積# 軌跡存儲self.trajectories = {}  # 存儲每個人的軌跡self.next_person_id = 1  # 下一個可用的人員IDself.max_disappeared_frames = 10  # 最大消失幀數self.max_distance = 100  # 最大匹配距離# 透視變換參數self.perspective_transform = Noneself.warped_width = 500self.warped_height = self.frame_height  # 與原始幀高度一致# 錄制設置self.out = Noneif save_video:timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")output_path = os.path.join(self.output_folder, f"tracking_{timestamp}.avi")fourcc = cv2.VideoWriter_fourcc(*'XVID')self.out = cv2.VideoWriter(output_path, fourcc, self.fps, (self.frame_width, self.frame_height))def calibrate_perspective(self):"""校準透視變換,創建鳥瞰圖"""print("請在圖像中選擇4個點,形成一個矩形區域,用于透視變換")print("按順序點擊:左上、右上、右下、左下")# 讀取一幀用于選擇點ret, frame = self.cap.read()if not ret:print("無法讀取視頻幀")return False# 創建窗口并設置鼠標回調cv2.namedWindow("選擇透視變換點 (按 'q' 退出)")points = []def click_event(event, x, y, flags, param):if event == cv2.EVENT_LBUTTONDOWN:points.append((x, y))cv2.circle(frame, (x, y), 5, (0, 255, 0), -1)cv2.imshow("選擇透視變換點 (按 'q' 退出)", frame)cv2.setMouseCallback("選擇透視變換點 (按 'q' 退出)", click_event)# 顯示圖像并等待點擊cv2.imshow("選擇透視變換點 (按 'q' 退出)", frame)while len(points) < 4:key = cv2.waitKey(1) & 0xFFif key == ord('q'):cv2.destroyAllWindows()return Falsecv2.destroyAllWindows()# 定義目標矩形src = np.float32(points)dst = np.float32([[0, 0],[self.warped_width, 0],[self.warped_width, self.warped_height],[0, self.warped_height]])# 計算透視變換矩陣self.perspective_transform = cv2.getPerspectiveTransform(src, dst)return Truedef detect_persons(self, frame):"""檢測圖像中的人物"""# 應用背景減除fgmask = self.fgbg.apply(frame)# 圖像預處理_, thresh = cv2.threshold(fgmask, 127, 255, cv2.THRESH_BINARY)kernel = np.ones((5, 5), np.uint8)thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=3)# 查找輪廓contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)persons = []for contour in contours:area = cv2.contourArea(contour)if area < self.min_contour_area or area > self.max_contour_area:continue# 計算邊界框x, y, w, h = cv2.boundingRect(contour)center = (int(x + w/2), int(y + h/2))# 計算輪廓的中心點M = cv2.moments(contour)if M["m00"] != 0:cX = int(M["m10"] / M["m00"])cY = int(M["m01"] / M["m00"])center = (cX, cY)persons.append({'bbox': (x, y, w, h),'center': center,'contour': contour,'area': area})return persons, threshdef track_persons(self, detected_persons):"""跟蹤檢測到的人員"""# 計算當前檢測點與現有軌跡的距離unmatched_tracks = list(self.trajectories.keys())unmatched_detections = list(range(len(detected_persons)))matches = []# 計算所有可能的匹配for track_id in self.trajectories:trajectory = self.trajectories[track_id]last_position = trajectory['positions'][-1]min_distance = float('inf')min_index = -1for i, person in enumerate(detected_persons):if i in unmatched_detections:distance = np.sqrt((last_position[0] - person['center'][0])**2 + (last_position[1] - person['center'][1])**2)if distance < min_distance and distance < self.max_distance:min_distance = distancemin_index = i# 如果找到匹配if min_index != -1:matches.append((track_id, min_index, min_distance))# 按距離排序,優先處理距離近的匹配matches.sort(key=lambda x: x[2])# 應用匹配for match in matches:track_id, detection_index, _ = matchif track_id in unmatched_tracks and detection_index in unmatched_detections:# 更新軌跡self.trajectories[track_id]['positions'].append(detected_persons[detection_index]['center'])self.trajectories[track_id]['last_seen'] = 0self.trajectories[track_id]['bbox'] = detected_persons[detection_index]['bbox']# 從待匹配列表中移除unmatched_tracks.remove(track_id)unmatched_detections.remove(detection_index)# 處理未匹配的軌跡for track_id in unmatched_tracks:self.trajectories[track_id]['last_seen'] += 1if self.trajectories[track_id]['last_seen'] > self.max_disappeared_frames:del self.trajectories[track_id]# 處理未匹配的檢測結果for detection_index in unmatched_detections:# 創建新軌跡self.trajectories[self.next_person_id] = {'positions': [detected_persons[detection_index]['center']],'last_seen': 0,'bbox': detected_persons[detection_index]['bbox'],'start_time': time.time()}self.next_person_id += 1def draw_results(self, frame, persons, thresh):"""在圖像上繪制檢測和跟蹤結果"""output = frame.copy()# 繪制檢測到的人物for person in persons:x, y, w, h = person['bbox']cv2.rectangle(output, (x, y), (x + w, y + h), (0, 255, 0), 2)cv2.circle(output, person['center'], 5, (0, 0, 255), -1)# 繪制軌跡for track_id, trajectory in self.trajectories.items():positions = trajectory['positions']# 繪制軌跡線for i in range(1, len(positions)):cv2.line(output, positions[i-1], positions[i], (255, 0, 0), 2)# 繪制軌跡點for pos in positions:cv2.circle(output, pos, 3, (255, 0, 0), -1)# 繪制ID和軌跡長度if len(positions) > 0:last_pos = positions[-1]cv2.putText(output, f"ID: {track_id}", (last_pos[0] + 10, last_pos[1] - 20),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)cv2.putText(output, f"Points: {len(positions)}", (last_pos[0] + 10, last_pos[1]),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 0, 0), 2)# 顯示統計信息cv2.putText(output, f"Persons: {len(self.trajectories)}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)cv2.putText(output, f"FPS: {int(self.fps)}", (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)# 創建結果顯示窗口if self.show_warped and self.perspective_transform is not None:# 創建鳥瞰圖warped = cv2.warpPerspective(output, self.perspective_transform, (self.warped_width, self.warped_height))# 在鳥瞰圖上繪制軌跡for track_id, trajectory in self.trajectories.items():positions = trajectory['positions']for i in range(1, len(positions)):# 將原始坐標轉換為鳥瞰圖坐標pos1 = np.array([[positions[i-1][0], positions[i-1][1]]], dtype=np.float32).reshape(-1, 1, 2)pos2 = np.array([[positions[i][0], positions[i][1]]], dtype=np.float32).reshape(-1, 1, 2)warped_pos1 = cv2.perspectiveTransform(pos1, self.perspective_transform)[0][0]warped_pos2 = cv2.perspectiveTransform(pos2, self.perspective_transform)[0][0]cv2.line(warped, (int(warped_pos1[0]), int(warped_pos1[1])),(int(warped_pos2[0]), int(warped_pos2[1])), (255, 0, 0), 2)# 合并顯示combined = np.hstack((output, warped))return combinedreturn outputdef save_trajectories(self):"""保存軌跡數據到文件"""timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")output_path = os.path.join(self.output_folder, f"trajectories_{timestamp}.txt")with open(output_path, 'w') as f:f.write("Person Trajectories\n")f.write(f"Recorded on: {datetime.now()}\n\n")for track_id, trajectory in self.trajectories.items():f.write(f"Person ID: {track_id}\n")f.write(f"Start Time: {time.ctime(trajectory['start_time'])}\n")f.write(f"Duration: {time.time() - trajectory['start_time']:.2f} seconds\n")f.write(f"Trajectory Points: {len(trajectory['positions'])}\n")f.write("Positions:\n")for pos in trajectory['positions']:f.write(f"  ({pos[0]}, {pos[1]})\n")f.write("\n")print(f"軌跡數據已保存到: {output_path}")def run(self):"""運行人員跟蹤系統"""# 首先進行透視校準if not self.calibrate_perspective():print("透視校準失敗,使用原始視角")print("開始人員跟蹤...")print("按 'q' 退出,按 's' 保存軌跡數據")frame_count = 0start_time = time.time()while True:ret, frame = self.cap.read()if not ret:break# 計算實際幀率frame_count += 1if frame_count % 10 == 0:elapsed_time = time.time() - start_timeself.fps = frame_count / elapsed_time# 檢測人員persons, thresh = self.detect_persons(frame)# 跟蹤人員self.track_persons(persons)# 繪制結果result = self.draw_results(frame, persons, thresh)# 保存視頻if self.save_video:self.out.write(result)# 顯示結果cv2.imshow("人員軌跡跟蹤系統 (按 'q' 退出,按 's' 保存軌跡)", result)# 按鍵處理key = cv2.waitKey(1) & 0xFFif key == ord('q'):breakelif key == ord('s'):self.save_trajectories()# 釋放資源self.cap.release()if self.out:self.out.release()cv2.destroyAllWindows()print("人員跟蹤系統已關閉")# 主程序入口
if __name__ == "__main__":# 創建人員跟蹤器實例tracker = PersonTracker(video_source=0,  # 0表示默認攝像頭,也可以指定視頻文件路徑save_video=True,  # 是否保存視頻show_warped=True  # 是否顯示鳥瞰圖)# 運行跟蹤器tracker.run()    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81411.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81411.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81411.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[強化學習的數學原理—趙世鈺老師]學習筆記02-貝爾曼方程

本人為強化學習小白&#xff0c;為了在后續科研的過程中能夠較好的結合強化學習來做相關研究&#xff0c;特意買了西湖大學趙世鈺老師撰寫的《強化學習數學原理》中文版這本書&#xff0c;并結合趙老師的講解視頻來學習和更深刻的理解強化學習相關概念&#xff0c;知識和算法技…

Docker入門指南:鏡像、容器與倉庫的核心概念解析

目錄 前言&#xff1a;為什么需要Docker&#xff1f; 一、Docker能做什么&#xff1f; 二、核心概念解析 1. 鏡像&#xff08;Image&#xff09;&#xff1a;應用的標準化打包 2. 容器&#xff08;Container&#xff09;&#xff1a;鏡像的運行實例 3. 鏡像倉庫&#xff0…

大模型微調實戰:基于GpuGeek平臺的低成本高效訓練方案

文章目錄 引言一、GpuGeek平臺使用入門1. 注冊與賬號設置2. 控制臺功能概覽3. 快速創建GPU實例3. 預置鏡像與自定義環境 二、GpuGeek平臺核心優勢解析1. 顯卡資源充足&#xff1a;多卡并行加速訓練2. 鏡像超多&#xff1a;開箱即用的開發環境3. 計費靈活&#xff1a;按需付費降…

Linux:計算機的層狀結構

1.馮諾依曼體系結構 我們常見的計算機&#xff0c;如筆記本、臺式機。我們不常見的計算機&#xff0c;如服務器&#xff0c;大部分都遵守馮諾依曼體系結構。 CPU&#xff1a;運算器和控制器組成。運算器主要工作是做算術運算和邏輯運算。控制器主要工作是協調設備之間信息流動的…

LangGraph(四)——加入人機交互控制

目錄 1. 引言2. 添加Human Assistance工具3. 編譯狀態圖4. 提示聊天機器人5. 恢復執行參考 1. 引言 智能體可能不可靠&#xff0c;甚至需要人工輸入才能完成任務。同樣&#xff0c;對于某些操作&#xff0c;你可能需要在運行前獲得人工批準&#xff0c;以保證一切按預期運行。 …

數據結構【AVL樹】

AVL樹 1.AVL樹1.AVL的概念2.平衡因子 2.AVl樹的實現2.1AVL樹的結構2.2AVL樹的插入2.3 旋轉2.3.1 旋轉的原則 1.AVL樹 1.AVL的概念 AVL樹可以是一個空樹。 它的左右子樹都是AVL樹&#xff0c;且左右子樹的高度差的絕對值不超過1。AVL樹是一顆高度平衡搜索二叉樹&#xff0c;通…

JavaScript【5】DOM模型

1.概述&#xff1a; DOM (Document Object Model)&#xff1a;當頁面被加載時&#xff0c;瀏覽器會創建頁面的文檔對象模型&#xff0c;即dom對象&#xff1b;dom對象會被結構化為對象樹&#xff0c;如一個HTML文檔會被分為head&#xff0c;body等部分&#xff0c;而每個部分又…

STM32燒錄程序正常,但是運行異常

一、硬件配置問題 BOOT引腳設置錯誤 STM32的啟動模式由BOOT0和BOOT1引腳決定。若設置為從RAM啟動&#xff08;BOOT01&#xff0c;BOOT10&#xff09;&#xff0c;程序在掉電后無法保存&#xff0c;導致復位后無法正常運行。應確保BOOT00&#xff08;從Flash啟動&#xff09;15。…

汽車二自由度系統模型以及電動助力轉向系統模型

汽車二自由度系統模型與電動助力轉向系統&#xff08;EPS&#xff09;的詳細建模方案&#xff0c;包含理論推導、MATLAB/Simulink實現代碼及參數說明&#xff1a; 一、二自由度汽車模型 1. 模型描述 包含以下兩個自由度&#xff1a; 橫向運動&#xff08;側向加速度&#xf…

git提交庫常用詞

新功能 feat修改BUG fix文檔修改 docs格式修改 style重構 refactor性能提升 perf測試 test構建系統 build對CI配置文件修改 ci修改構建流程、或增加依賴庫、工具 chore回滾版本 revert

JavaScript 時間轉換:從 HH:mm:ss 到十進制小時及反向轉換

關鍵點 JavaScript 可以輕松實現時間格式&#xff08;HH:mm:ss 或 HH:mm&#xff09;與十進制小時&#xff08;如 17.5&#xff09;的相互轉換。兩個函數分別處理時間字符串到十進制小時&#xff0c;以及十進制小時到時間字符串的轉換&#xff0c;支持靈活的輸入和輸出格式。這…

LLM智能體新紀元:深入解析MCP與A2A協議,賦能智能自動化協作

LLM智能體&#xff08;LLM agents&#xff09;是能夠自主行動以實現特定目標的AI系統。在實際應用中&#xff0c;智能體能夠將用戶請求拆解為多個步驟&#xff0c;利用知識庫或API獲取數據&#xff0c;最終整合出答案。這讓智能體相比于傳統獨立聊天機器人擁有更強大的能力——…

[PMIC]PMIC重要知識點總結

PMIC重要知識點總結 摘要&#xff1a;PMIC (Power Management Integrated Circuit) 是現代電子設備中至關重要的組件&#xff0c;負責電源管理&#xff0c;包括電壓調節、電源轉換、電池管理和功耗優化等。PMIC 中的數字部分主要涉及控制邏輯、狀態機、寄存器配置、通信接口&am…

PYTHON訓練營DAY28

類 &#xff08;一&#xff09;題目1&#xff1a;定義圓&#xff08;Circle&#xff09;類 要求&#xff1a; 包含屬性&#xff1a;半徑 radius。包含方法&#xff1a; calculate_area()&#xff1a;計算圓的面積&#xff08;公式&#xff1a;πr&#xff09;。calculate_circ…

機器學習-人與機器生數據的區分模型測試 -數據篩選

內容繼續機器學習-人與機器生數據的區分模型測試 使用隨機森林的弱學習樹來篩選相對穩定的特征數據 # 隨機森林篩選特征 X data.drop([city, target], axis1) # 去除修改前的城市名稱列和目標變量列 y data[target] X_train, X_test, y_train, y_test train_test_split(X…

Data whale LLM universe

使用LLM API開發應用 基本概念 Prompt Prompt 最初指的是自然語言處理研究人員為下游任務設計的一種任務專屬的輸入模板。 Temperature 使用Temperature參數控制LLM生成結果的隨機性和創造性&#xff0c;一般取值設置在0~1之間&#xff0c;當取值接近1的時候預測的隨機性較…

Azure 應用的托管身份與服務主體

Microsoft Entra ID -- 前稱 Azure Active Directory -- 提供強大的身份驗證和授權功能。托管身份和服務主體通過限制憑據暴露的風險來幫助確保對 Azure 資源的訪問安全。 托管身份為Azure原生應用程序自動管理身份&#xff0c;而服務主體則非常適合需要訪問Azure資源的外部應…

16 C 語言布爾類型與 sizeof 運算符詳解:布爾類型的三種聲明方式、執行時間、賦值規則

1 布爾類型 1.1 布爾類型概述 布爾類型用于表示邏輯上的真&#xff08;true&#xff09;和假&#xff08;false&#xff09;兩種狀態&#xff0c;是編程中條件判斷和邏輯運算的基礎。在 C 語言中&#xff0c;布爾值的表示方式隨著標準的發展而不斷完善。 1.2 布爾類型的三種聲…

【C++詳解】string各種接口如何使用保姆級攻略

文章目錄 一、string介紹二、string使用構造函數析構函數賦值運算符重載string的遍歷修改方法1、下標[]2、迭代器3、范圍for 迭代器使用詳解const迭代器反向迭代器&#xff08;reverse) Capacity(容量相關)size/lengthmax_sizecapacityclear/emptyshrink_to_fit(縮容)reserve(擴…

回調函數應用示例

回調函數是一種通過函數指針&#xff08;或引用&#xff09;調用的函數&#xff0c;它在特定事件或條件發生時被另一個函數調用。回調函數的核心思想是將函數作為參數傳遞&#xff0c;以便在適當的時候執行自定義邏輯&#xff0c;常用于異步編程、事件驅動架構等場景。 業務場景…