OpenCv高階(九)——背景建模

目錄

一、背景建模的核心目標與核心挑戰

1.?核心目標

2.?核心挑戰

?二、背景建模模型

1、幀差法原理

2.?概率模型(Parametric Models)

(1)高斯混合模型(Gaussian Mixture Model, GMM)

(2)單高斯模型(Single Gaussian Model)

3.?非參數模型(Non-Parametric Models)

(1)K 近鄰(K-Nearest Neighbors, KNN)

(2)ViBe 算法(Visual Background Extractor)

三、主流背景建模算法對比與解析

1.?MOG2(Gaussian Mixture-Based Background Subtraction)

(1)算法原理

(2)OpenCV 實現

(3)優缺點

2.?KNN 背景減除

(1)算法原理

(2)OpenCV 實現

(3)優缺點

3.?GMG(Gaussian Mixture-based Background Subtraction with GMG)

(1)算法原理

(2)OpenCV 實現(需手動實現核心邏輯)

(3)優缺點

4.?CNT(Codebook Background Subtraction)

(1)算法原理

(2)OpenCV 實現(需安裝opencv-contrib-python)

(3)優缺點

5.?ViBe 算法(Visual Background Extractor)

(1)算法原理

(2)手動實現核心邏輯

(3)優缺點

四、背景建模的完整實現流程(以 MOG2 為例)

1.?輸入預處理

2.?背景模型初始化

3.?前景提取與后處理

4.?背景模型更新

五、背景建模代碼逐步分解

1. 初始化環境與讀取視頻

2. 預處理工具準備

3. 逐幀處理主循環

(1) 讀取視頻幀

(2) 顯示原始幀

(3) 背景減除獲取前景掩膜

(4) 形態學開運算去噪

(5) 輪廓檢測與篩選

(6) 顯示檢測結果

4. 資源釋放

完整代碼展示

六、總結:如何選擇合適的背景建模算法


在計算機視覺中,背景建模(Background Modeling)?是從視頻序列中分離動態前景與靜態背景的核心技術,廣泛應用于運動檢測、目標跟蹤、視頻監控等領域。它通過學習場景的統計特性構建背景模型,并實時更新以適應環境變化。在視頻中,背景通常被定義為相對穩定的部分,例如墻壁、地面或天空等。背景建模的目標是將動態的前景對象與靜態的背景進行分離,以便進一步分析和處理。

一、背景建模的核心目標與核心挑戰

1.?核心目標
  • 動態分割:實時區分前景(運動物體)與背景(靜態或緩慢變化的場景)。
  • 環境適應:處理光照變化、動態背景(如晃動的樹葉、水流)、相機抖動等干擾。
  • 高效穩定:在計算效率(實時性)與分割精度之間平衡,適應不同硬件平臺(CPU/GPU/ 嵌入式)。
2.?核心挑戰
  • 動態背景:背景元素本身運動(如旋轉的風扇、流動的河水),易被誤判為前景。
  • 光照突變:突然的亮度 / 色溫變化(如開燈、陰天轉晴天),導致背景模型失效。
  • 相機運動:手持設備拍攝或無人機航拍時,全局運動干擾局部前景檢測。
  • 初始化階段:前幾幀需無運動物體干擾,否則背景模型包含錯誤信息。


?
二、背景建模模型


1、幀差法原理

由于場景中的目標在運動,目標的影像在不同圖像幀中的位置不同。該類算法對時間上連續的兩幀圖像進行差分運算,不同幀對應的像素點相減,判斷灰度差的絕對值,當絕對值超過一定閾值時,即可判斷為運動目標,從而實現目標的檢測功能。


幀差法的優缺點:
幀差法非常簡單,但是會引入噪音和空洞(人物中間是黑色的)問題。

2.?概率模型(Parametric Models)

假設像素值服從特定概率分布,通過參數估計(如均值、方差)描述背景。

(1)高斯混合模型(Gaussian Mixture Model, GMM)
  • 核心思想:每個像素的背景由?K?個高斯分布混合表示,權重反映該分布的 “重要性”。
  • 數學表達
  • 更新策略:通過在線 EM 算法更新高斯分布的參數,淘汰低權重分布,納入新觀測值。
(2)單高斯模型(Single Gaussian Model)
  • 簡化版:假設背景像素服從單一高斯分布,適合靜態背景(如固定攝像頭監控場景)。
  • 缺點:無法處理多模態背景(如周期性運動的風扇葉片)。

3.?非參數模型(Non-Parametric Models)

不假設像素值的分布形式,直接存儲歷史觀測值作為背景模型。

(1)K 近鄰(K-Nearest Neighbors, KNN)
  • 核心思想:當前像素與歷史?K?個最近鄰像素比較,若距離小于閾值則為背景,否則為前景。
  • 距離度量:通常使用歐氏距離或曼哈頓距離。
  • 優點:對多模態背景魯棒性強,無需假設分布形式。
(2)ViBe 算法(Visual Background Extractor)
  • 核心思想:從初始幀隨機選取像素樣本作為背景模型,通過時空一致性(鄰域像素和時間幀)更新模型。
  • 創新點
    • 空間鄰域:利用當前像素的 8 鄰域樣本增強模型魯棒性。
    • 隨機子采樣:每個像素僅更新少量樣本,降低計算量。

三、主流背景建模算法對比與解析

1.?MOG2(Gaussian Mixture-Based Background Subtraction)

(1)算法原理
  • 每個像素用?K=3~5個高斯分布建模,按權重和方差排序,前?B?個分布構成背景
  • 支持動態更新背景模型,適應光照變化和緩慢運動的背景(如旋轉的吊燈)。
(2)OpenCV 實現
bg_subtractor = cv2.createBackgroundSubtractorMOG2(history=500,        # 參與背景建模的歷史幀數varThreshold=16,    # 像素值與背景模型的方差閾值detectShadows=True  # 檢測陰影(陰影標記為灰色,非前景)
)
fg_mask = bg_subtractor.apply(frame)  # 輸出二值掩碼(255=前景,0=背景,128=陰影)
(3)優缺點
  • 優點:速度較快(CPU 下約 20fps),支持陰影檢測,適合監控視頻。
  • 缺點:對快速變化的背景(如突然開關燈)適應較慢,內存占用隨歷史幀數增加。

2.?KNN 背景減除

(1)算法原理
  • 為每個像素維護一個歷史觀測值隊列(如最近 500 幀的像素值),通過 KNN 搜索判斷當前像素是否屬于背景。
  • 距離閾值動態調整,適應不同場景的噪聲水平。
(2)OpenCV 實現
bg_subtractor = cv2.createBackgroundSubtractorKNN(history=500,        # 歷史幀數dist2Threshold=400, # 平方距離閾值(值越大,檢測到的前景越少)detectShadows=True
)
fg_mask = bg_subtractor.apply(frame)
(3)優缺點
  • 優點:對動態背景(如水流、火焰)魯棒性強,適合自然場景。
  • 缺點:計算復雜度高(O (K) 近鄰搜索),內存占用大(存儲所有歷史樣本)。

3.?GMG(Gaussian Mixture-based Background Subtraction with GMG)

(1)算法原理
  • 初始化階段:前?N?幀(如 30 幀)用于構建初始背景模型,假設背景像素服從高斯分布。
  • 在線階段:通過貝葉斯推理更新背景模型,每個像素的前景概率由當前幀與背景模型的差異計算得到。
  • 創新點:引入 “軟判決”,用概率掩碼而非硬二值化,提升邊緣檢測精度。
(2)OpenCV 實現(需手動實現核心邏輯)
class GMGModel:def __init__(self, initial_frames, history=120):self.gmm = cv2.createBackgroundSubtractorMOG2(history=history)for frame in initial_frames:self.gmm.apply(frame)  # 預訓練背景模型def apply(self, frame):return self.gmm.apply(frame, learningRate=0.01)  # 低學習率緩慢更新
(3)優缺點
  • 優點:初始化快,適合靜態相機場景(如門禁監控)。
  • 缺點:相機移動或劇烈光照變化時易失效。

4.?CNT(Codebook Background Subtraction)

(1)算法原理
  • 每個像素的背景用碼本表示,碼本包含多個碼字(顏色區間),覆蓋該像素可能的取值范圍。
  • 碼字通過聚類算法生成,支持多模態分布(如周期性變化的像素值)。
(2)OpenCV 實現(需安裝opencv-contrib-python
import cv2.bgsegm as bgsegm
bg_subtractor = bgsegm.createBackgroundSubtractorCNT(use_history=True,    # 是否使用歷史幀更新碼本maxPixelDistance=30  # 像素與碼字的最大距離
)
fg_mask = bg_subtractor.apply(frame)
(3)優缺點
  • 優點:抗噪聲能力強,適合高動態范圍場景(如夜間車燈變化)。
  • 缺點:計算復雜度高,內存占用大(每個像素存儲多個碼字)。

5.?ViBe 算法(Visual Background Extractor)

(1)算法原理
  • 初始化:從第一幀隨機選取 200 個鄰域像素作為背景樣本(每個像素維護一個樣本集合)。
  • 更新策略
    • 每個像素以小概率(如 1/16)用當前值替換樣本集合中的隨機樣本。
    • 利用空間鄰域的樣本一致性,抑制孤立噪聲點。
(2)手動實現核心邏輯
class ViBe:def __init__(self, frame, sample_size=200, radius=20):self.sample_size = sample_sizeself.radius = radiusself.samples = np.zeros((frame.shape[0], frame.shape[1], sample_size), dtype=np.uint8)# 初始化:每個像素隨機選取鄰域樣本for i in range(frame.shape[0]):for j in range(frame.shape[1]):self.samples[i,j] = self._sample_neighbors(frame, i, j)def _sample_neighbors(self, frame, i, j):# 從3x3鄰域隨機選取sample_size個樣本(包括自身)neighbors = frame[max(0,i-1):min(frame.shape[0],i+2), max(0,j-1):min(frame.shape[1],j+2)].ravel()return np.random.choice(neighbors, self.sample_size, replace=False)def apply(self, frame):fg_mask = np.zeros(frame.shape[:2], dtype=np.uint8)for i in range(frame.shape[0]):for j in range(frame.shape[1]):# 計算當前像素與樣本的距離dist = np.sum(np.abs(self.samples[i,j] - frame[i,j]) < self.radius)if dist < 20:  # 小于匹配閾值,判為前景fg_mask[i,j] = 255# 以1/16概率更新樣本(僅前景像素更新)if np.random.rand() < 1/16:self.samples[i,j][np.random.randint(0, self.sample_size)] = frame[i,j]else:# 背景像素以1/16概率更新樣本,并擴散到鄰域if np.random.rand() < 1/16:ni, nj = self._get_random_neighbor(i,j)self.samples[ni,nj][np.random.randint(0, self.sample_size)] = frame[i,j]return fg_mask
(3)優缺點
  • 優點:速度極快(單幀處理時間 < 1ms),內存效率高,適合嵌入式設備。
  • 缺點:依賴第一幀初始化,相機移動時需重新校準。

四、背景建模的完整實現流程(以 MOG2 為例)

1.?輸入預處理

  • 灰度化:將彩色圖像轉為灰度圖(減少計算量,多數算法基于單通道)。
  • 縮放:降低分辨率(如從 1920x1080 縮至 640x480),提升實時性。
frame = cv2.resize(frame, (640, 480))
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

2.?背景模型初始化

  • history幀用于訓練背景(期間避免運動物體干擾,或通過參數允許動態更新)。
bg_subtractor = cv2.createBackgroundSubtractorMOG2(history=200)
for _ in range(200):bg_subtractor.apply(gray)  # 預訓練背景

3.?前景提取與后處理

  • 形態學操作:腐蝕(去除小噪聲點)和膨脹(連接斷裂的前景區域)。
  • 輪廓檢測:提取前景輪廓,過濾面積過小的區域(如面積 < 50 像素的噪聲)。
fg_mask = bg_subtractor.apply(gray)
fg_mask = cv2.erode(fg_mask, None, iterations=2)
fg_mask = cv2.dilate(fg_mask, None, iterations=2)
contours, _ = cv2.findContours(fg_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:if cv2.contourArea(cnt) > 50:  # 過濾小輪廓x, y, w, h = cv2.boundingRect(cnt)cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 2)

4.?背景模型更新

  • 自適應學習率bg_subtractor.apply(frame, learningRate=0.01),學習率越小,模型更新越慢(0 表示固定背景,1 表示完全用當前幀更新)。

五、背景建模代碼逐步分解

1. 初始化環境與讀取視頻

import cv2
cap = cv2.VideoCapture('../data/test.avi')
  • 任務

    • 導入OpenCV庫,提供圖像處理、視頻讀寫等基礎功能。

    • 創建VideoCapture對象,讀取指定路徑的視頻文件,為逐幀處理做準備。


2. 預處理工具準備

kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3,3))
fgbg = cv2.createBackgroundSubtractorMOG2()
  • 任務

    • 形態學核:創建3x3十字形結構元素,用于后續開運算(去噪)。

    • 背景建模器:初始化MOG2背景減除算法,動態建模背景,分離運動前景(如行人、車輛)。


3. 逐幀處理主循環

(1) 讀取視頻幀
ret, frame = cap.read()
if not ret:break
  • 任務

    • 讀取視頻的下一幀數據,ret判斷是否成功讀取(失敗則退出循環)。

    • frame變量存儲當前幀的BGR圖像數據,用于后續處理與顯示。


(2) 顯示原始幀
cv2.imshow('frame', frame)
  • 任務

    • 實時顯示原始視頻幀,用于直觀對比處理前后的效果。


(3) 背景減除獲取前景掩膜
fgmask = fgbg.apply(frame)
  • 任務

    • 應用MOG2算法,動態更新背景模型,生成前景二值掩膜。

    • 輸出:白色區域表示運動目標(前景),黑色為背景。

    • 光流關聯:此步驟定位可能發生運動的區域,為后續光流計算縮小范圍(減少計算量)。


(4) 形態學開運算去噪
fgmask_new = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
cv2.imshow('fgmask1', fgmask_new)
  • 任務

    • 開運算:先腐蝕后膨脹,消除細小噪聲點(如樹葉晃動、光照變化)。

    • 顯示處理后的前景掩膜,驗證去噪效果。

    • 光流優化:干凈的掩膜可提高光流估計的準確性,避免噪聲干擾運動向量計算。


(5) 輪廓檢測與篩選
_, contours, h = cv2.findContours(fgmask_new, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:perimeter = cv2.arcLength(c, True)if perimeter > 188:x,y,w,h = cv2.boundingRect(c)frame = cv2.rectangle(frame, (x,y), (x+w,y+h), (0,0,255), 2)
  • 任務

    • 輪廓檢測:在二值掩膜中查找連通區域,獲取所有潛在運動目標的輪廓。

    • 周長過濾:通過閾值(188)剔除小輪廓(噪聲),保留顯著運動物體。

    • 繪制邊界框:在原始幀上用紅色矩形標記運動目標的位置。

    • 光流定位:框選區域可作為光流算法的輸入ROI(Region of Interest),針對性計算運動方向與速度。


(6) 顯示檢測結果
cv2.imshow('frame_new_rect', frame)
k = cv2.waitKey(1)
if k == 27:break
  • 任務

    • 顯示帶檢測框的實時視頻,直觀反饋算法效果。

    • 檢測鍵盤輸入,按下ESC鍵(ASCII 27)退出循環。


4. 資源釋放

cap.release()
cv2.destroyAllWindows()
  • 任務

    • 釋放視頻捕獲對象,關閉所有OpenCV窗口,防止內存泄漏。

完整代碼展示

# 導入OpenCV庫,用于計算機視覺任務
import cv2# 獲取視頻信息:創建VideoCapture對象,讀取視頻文件
cap = cv2.VideoCapture('../data/test.avi')# 創建形態學操作核:使用3x3的十字形結構元素,用于后續的開運算去噪
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
# 創建背景減除器:使用MOG2算法進行動態背景建模,用于提取運動前景
fgbg = cv2.createBackgroundSubtractorMOG2()# 主循環:逐幀處理視頻
while True:# 讀取當前幀:ret表示讀取狀態,frame為圖像數據ret, frame = cap.read()# 檢查幀是否讀取成功,失敗則退出循環if not ret:break# 顯示原始視頻幀cv2.imshow('frame', frame)# 應用背景減除器:獲得前景掩膜(二值圖像,白色代表前景運動區域)fgmask = fgbg.apply(frame)# 形態學開運算處理:去除前景掩膜中的小噪聲點fgmask_new = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)cv2.imshow('fgmask1', fgmask_new)  # 顯示處理后的前景掩膜# 查找輪廓:檢測二值圖像中的連通區域# 參數說明:RETR_EXTERNAL只檢測外部輪廓,CHAIN_APPROX_SIMPLE壓縮水平、垂直和對角線段# 注意:OpenCV版本不同返回值可能不同,新版返回兩個值(contours, hierarchy)_, contours, h = cv2.findContours(fgmask_new, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 遍歷所有檢測到的輪廓for c in contours:# 計算輪廓周長(permier應為perimeter,變量名拼寫錯誤)perimeter = cv2.arcLength(c, True)# 篩選較大輪廓:周長閾值設為188(根據場景調整,用于過濾小噪聲)if perimeter > 188:# 獲取輪廓的外接矩形坐標x, y, w, h = cv2.boundingRect(c)# 在原始幀上繪制紅色矩形框(BGR格式:(0,0,255)為紅色)frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)# 顯示帶檢測框的結果幀cv2.imshow('frame_new_rect', frame)# 檢測按鍵輸入:ESC鍵(ASCII 27)退出循環k = cv2.waitKey(1)if k == 27:break# 釋放資源(隱式執行,但顯式釋放更規范)
cap.release()
cv2.destroyAllWindows()

六、總結:如何選擇合適的背景建模算法

場景需求推薦算法核心參數調優
固定攝像頭,靜態背景GMG、單高斯模型history=100,?detectShadows=True
動態背景(如樹葉、水流)KNN、ViBeK=50,?radius=20(ViBe)
實時性優先(嵌入式設備)ViBe、簡化 MOG2history=200,?varThreshold=25
復雜光照變化CNT、MOG2detectShadows=True, 低學習率(0.001)
多模態背景(周期性運動)GMM(K=3~5)增加高斯分布數量,動態調整背景比例閾值

?背景建模是視頻分析的基石,其核心價值在于平衡模型魯棒性與計算效率。通過理解不同算法的適用場景、參數含義及后處理技巧,結合具體硬件條件和場景需求,可實現精準的前景提取,為上層計算機視覺任務奠定堅實基礎。

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

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

相關文章

小重構,大收益!技術重構實踐:如何優雅升級老舊接口

重構格言&#xff1a;"優秀系統不是設計出來的&#xff0c;而是通過持續重構演進而來的。" —— Martin Fowler《重構&#xff1a;改善既有代碼的設計》 希望本文能為您的重構之旅提供指引&#xff0c;讓老舊系統煥發新生&#xff01; 一、背景&#xff1a;一個“穩定…

OSPF中DR/BDR的選舉

OSPF 開放式最短路徑優先協議-CSDN博客 選舉原因&#xff1a;廣播網絡中使路由信息交換更加高速有序&#xff0c;可以降低需要維護的鄰接關系數量 基本概念&#xff1a; DR (Designated Router, 指定路由器)&#xff1a;負責在廣播網絡&#xff08;以太網&#xff09;或NBMA網…

[特殊字符]?[特殊字符]Linux驅動開發入門 | 并發與互斥機制詳解

文章目錄 &#x1f468;?&#x1f4bb;Linux驅動開發入門 | 并發與互斥機制詳解&#x1f4cc;為什么驅動中需要并發和互斥控制&#xff1f;&#x1f4a1;常見的并發控制機制&#x1f510;自旋鎖和信號量通俗理解&#x1f300;自旋鎖&#xff08;Spinlock&#xff09;——“廁所…

Kafka 架構設計和組件介紹

什么是Apache Kafka&#xff1f; Apache Kafka 是一個強大的開源分布式事件流平臺。它最初由 LinkedIn 開發&#xff0c;最初是一個消息隊列&#xff0c;后來發展成為處理各種場景數據流的工具。 Kafka 的分布式系統架構支持水平擴展&#xff0c;使消費者能夠按照自己的節奏檢…

elk中kibana一直處于可用和降級之間且es群集狀態并沒有問題的解決方法

前言 在公司部elk的時候發現kibana的web界面一直很卡&#xff0c;數據量為0也會很卡&#xff0c;es群集狀態正常&#xff0c;資源足夠。 報錯信息 [2025-03-17T09:54:50.19400:00][INFO ][status] Kibana is now available (was degraded) [2025-03-17T09:55:03.28000:00][I…

什么是視頻上墻

視頻聯動上墻是指當監控系統中出現報警或其他特定事件時&#xff0c;相關的視頻畫面能夠自動切換并顯示在指定的監控大屏或顯示設備上&#xff0c;以便監控人員能夠快速、直觀地查看事件現場的情況&#xff0c;及時做出響應和處理。 具體介紹? 系統組成 &#xff1a;一般由前端…

26考研——存儲系統(3)

408答疑 文章目錄 一、存儲器概述二、主存儲器三、主存儲器與 CPU 的連接四、外部存儲器五、高速緩沖存儲器六、虛擬存儲器七、參考資料鮑魚科技課件26王道考研書 八、總結復習提示思考題常見問題和易混淆知識點 一、存儲器概述 文章鏈接: 點擊跳轉 二、主存儲器 文章鏈接: …

.NET 6 + Dapper + User-Defined Table Type

大家都知道&#xff0c;對于SQL Server IN是有限制條件的&#xff0c;如果IN里面的內容過多&#xff0c;在執行的時候會被自動截斷&#xff0c;因而導致查詢到的結果不是實際需要的結果。 select * from Payments where Id in (1,2,3,4,...) 為了解決上面的限制&#xff0c;可以…

MySQL 8(Ubuntu 18.04.6 LTS)安裝筆記

一、前言 其實之前已經寫過一篇筆記【MySQL 8.0.34&#xff08;x64&#xff09;安裝筆記】。機緣巧合&#xff0c;這次遇到的環境是Ubuntu 18.04 LTS&#xff0c;相比Windows平臺的安裝&#xff0c;對mysql的版本以及依賴的選擇&#xff0c;稍微要窄一些。特作筆記。 二、準備…

學習 Apache Kafka

學習 Apache Kafka 是一個很好的選擇&#xff0c;尤其是在實時數據流處理和大數據領域。以下是一個系統化的學習建議&#xff0c;幫助你從入門到進階掌握 Kafka&#xff1a; 1. 先決條件 在開始 Kafka 之前&#xff0c;確保你具備以下基礎&#xff1a; Java 基礎&#xff1a;K…

使用 binlog2sql 閃回 MySQL8 數據

【說明】 MySQL服務器版本 8.0.26 mysql> SELECT version(); ----------- | version() | ----------- | 8.0.26 | -----------Python 版本 Python 3.8.10 [infuq ~]# python -V Python 3.8.10【安裝】 binlog2sql 官方地址 1.安裝 binlog2sql [infuq ~]# git clone …

JavaScript 異步編程與請求取消全指南

JavaScript 異步編程與請求取消全指南 涵蓋&#xff1a;同步/異步、Promise、async/await、AbortController、前后端協作 一、同步與異步 1. 同步&#xff08;Synchronous&#xff09; 定義&#xff1a;代碼按順序執行&#xff0c;前一步完成才能執行下一步。特點&#xff1…

永久緩存 Git 憑證

永久緩存 Git 憑證 打開終端或命令行工具。 執行以下命令&#xff0c;設置 Git 使用 store 憑證幫助程序&#xff1a; bash git config --global credential.helper store第一次執行 git pull 時輸入賬號密碼。之后&#xff0c;所有需要憑證的操作都將自動使用存儲的憑證&…

力扣-48.旋轉圖像

題目描述 給定一個 n n 的二維矩陣 matrix 表示一個圖像。請你將圖像順時針旋轉 90 度。 你必須在 原地 旋轉圖像&#xff0c;這意味著你需要直接修改輸入的二維矩陣。請不要 使用另一個矩陣來旋轉圖像。 class Solution { public:void rotate(vector<vector<int>…

Qt ModbusSlave多線程實踐總結

最近項目中用到了ModbusSlave&#xff0c;也就是Modbus從設備的功能&#xff0c;之前用的基本都是master設備&#xff0c;所以讀取數據啥的用單線程就行了&#xff0c;用 void WaitHelper::WaitImplByEventloop(int msec) {QEventLoop loop;QTimer::singleShot(msec, &loop…

opencv--圖像

像素(像素點) 定義&#xff1a; Pixel 是 Picture Element&#xff08;圖像元素&#xff09;的縮寫&#xff0c;是數字圖像中最小的獨立單位。每個像素代表圖像中的一個點的顏色和亮度信息。 關鍵特性&#xff1a; 顏色&#xff1a;通過不同的色彩模型&#xff08;如RGB、CMYK…

記錄學習匯編語言02+各種寄存器分類

8086cpu是十六位的 然后寄存器能存八位 所以分為高八位低八位 高八位在下面低八位在上面 從下往上讀&#xff08;從地址小的地方開始讀&#xff09; 8086cpu種有兩個和棧相關的寄存器 棧段寄存器ss&#xff08;棧頂的段寄存器&#xff09; 棧頂指針寄存器sp&#xff08;…

OpenCV 圖形API(53)顏色空間轉換-----將 RGB 圖像轉換為灰度圖像函數RGB2Gray()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 將圖像從 RGB 色彩空間轉換為灰度。 R、G 和 B 通道值的常規范圍是 0 到 255。生成的灰度值計算方式如下&#xff1a; dst ( I ) 0.299 ? src…

(51單片機)LCD顯示數據存儲(DS1302時鐘模塊教學)(LCD1602教程)(獨立按鍵教程)(延時函數教程)(I2C總線認識)(AT24C02認識)

目錄 演示視頻&#xff1a; 源代碼 main.c LCD1602.c LCD1602.h AT24C02.c AT24C02.h Key.c Key.h I2C.c I2C.h Delay.c Delay.h 代碼解析與教程&#xff1a; Dealy模塊 LCD1602模塊 Key模塊 I2C總線模塊 AT24C02模塊 /E2PROM模塊 main模塊 演示視頻&#xff1a; E2…

電子病歷高質量語料庫構建方法與架構項目(數據遺忘篇)

引言 在人工智能與醫療健康的深度融合時代,醫療數據的價值與風險并存。跨機構和平臺的醫療數據共享對于推動醫學研究、提高診斷精度和實現個性化治療至關重要,但同時也帶來了前所未有的隱私挑戰。先進的AI技術可以從理論上去標識化的醫療掃描中重新識別個人身份,例如從MRI數…