運動檢測技術(shù)(OpenCV 上的代碼)
近年來,運動檢測技術(shù)已成為計算機視覺的重要研究領(lǐng)域之一。視頻序列上已經(jīng)發(fā)明了許多方法,其中一些方法比其他方法更好。在本文中,我們將解釋并在 OpenCV 上實現(xiàn)一些基本方法。
1. 幀差分
幀差分背后的想法非常簡單。我們逐像素檢查兩個視頻幀之間的差異。如果有運動,像素值就會發(fā)生變化,因此我們將獲得運動圖。
很簡單對嗎?但是,由于噪聲(例如照明的變化)可能會發(fā)生一些像素值變化,為了避免在我們的運動蒙版中捕獲噪聲,我們應(yīng)用了一個閾值,該閾值基本上會突出強度方面的大變化并丟棄小的變化。請注意,閾值沒有正確的選擇,通常是憑經(jīng)驗完成的。
現(xiàn)在我們理解了這個概念,讓我們展示一些代碼:
frames=[]
MAX_FRAMES = 1000
N = 2
THRESH = 60
ASSIGN_VALUE = 255 #Value to assign the pixel if the threshold is met
cap = cv2.VideoCapture(0) #Capture using Computer's Webcam
for t in range(MAX_FRAMES):
#Capture frame by frame
ret, frame = cap.read()
#Convert frame to grayscale
frame_gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
#Append to list of frames
frames.a(chǎn)ppend(frame_gray)
if t >= N:
#D(N) = || I(t) - I(t+N) || = || I(t-N) - I(t) ||
diff = cv2.a(chǎn)bsdiff(frames[t-N], frames[t])
#Mask Thresholding
threshold_method = cv2.THRESH_BINARY
ret, motion_mask = cv2.threshold(diff, THRESH, ASSIGN_VALUE, threshold_method)
#Display the Motion Mask
cv2.imshow('Motion Mask', motion_mask)
這種方法具有計算性能,但是它存在兩個主要缺點:前景光圈和由幀速率和物體速度引起的重影。
Kameda 和 Minoh 開發(fā)的一種解決方案是雙重差分,我們在時間 t 和 t-1 以及 t-1 和 t-2 之間的兩個幀之間操作閾值差異,然后將它們與邏輯 AND 結(jié)合以確保我們始終檢測到一個對象而不是它的重影。
幀差分的另一個問題是,當(dāng)對象停止移動時,它不再被檢測到。這顯然取決于我們想要完成的任務(wù),但是假設(shè)我們想要繼續(xù)檢測移動物體,即使它停止了一段時間。這個問題的一個答案是背景減法技術(shù)。
2. 背景減法
背景減法是一種廣泛使用的方法,用于檢測靜態(tài)攝像機幀序列中的移動對象。它需要一個參考圖像來播放背景(通常在沒有對象的情況下獲。H缓笪覀冇嬎惝(dāng)前幀和背景幀(參考圖像)之間的差異。其主要任務(wù)是檢測通常代表運動物體的前景。
background = None
MAX_FRAMES = 1000
THRESH = 60
ASSIGN_VALUE = 255
cap = cv2.VideoCapture(0)
for t in range(MAX_FRAMES):
# Capture frame-by-frame
ret, frame = cap.read()
# Convert frame to grayscale
frame_gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
if t == 0:
# Train background with first frame
background = frame_gray
else:
# Background subtraction
diff = cv2.a(chǎn)bsdiff(background, frame_gray)
# Mask thresholding
ret, motion_mask = cv2.threshold(diff, THRESH, ASSIGN_VALUE, cv2.THRESH_BINARY)
# Display the motion mask and background
cv2.imshow('Motion mask', motion_mask)
cv2.imshow('Background', background)
背景減法代碼
如果對象的顏色與背景框不同,這種方法可以獲得很好的效果。然而,像幀差分一樣,它也有一些主要的缺點。毋庸置疑,它對光照變化和相機運動高度敏感,它還有一個“waking person"問題,這意味著如果背景物體(屬于參考圖像的物體)移動,則同時檢測到真實物體及其重影.
在這種情況下,我們遇到了與幀差分相反的問題:“如果我們想停止檢測前景對象并將其吸收到背景中怎么辦?”
3. 自適應(yīng)背景減法
這種方法基本上結(jié)合了之前的兩種技術(shù),通過引入學(xué)習(xí)率 λ 來充分利用兩者。在每個時間步,我們對傳入圖像和先前背景的貢獻進行加權(quán)以構(gòu)建新背景。
例如,如果我們設(shè)置 λ=0.1,則在更新背景幀之前需要 10 幀(換句話說,前景對象將被吸收到背景中)。而對于 λ=0.5,我們有更快的更新(更新前只需要 2 幀)。請注意,選擇 λ 沒有規(guī)則,它是憑經(jīng)驗完成的,因為它取決于我們正在處理的任務(wù)和環(huán)境。
background = None
MAX_FRAMES = 1000
THRESH = 60
ASSIGN_VALUE = 255
ALPHA = 0.1
def update_background(current_frame, prev_bg, alpha):
bg = alpha * current_frame + (1 - alpha) * prev_bg
bg = np.uint8(bg)
return bg
cap = cv2.VideoCapture(0)
for t in range(MAX_FRAMES):
# Capture frame-by-frame
ret, frame = cap.read()
# Convert frame to grayscale
frame_gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
if t == 0:
# Train background with first frame
background = frame_gray
else:
# Background subtraction
diff = cv2.a(chǎn)bsdiff(background, frame_gray)
# Mask thresholding
ret, motion_mask = cv2.threshold(diff, THRESH, ASSIGN_VALUE, cv2.THRESH_BINARY)
# Update background
background = update_background(frame_gray, background, alpha = ALPHA)
# Display the motion mask and background
cv2.imshow('Motion mask', motion_mask)
cv2.imshow('Background', background)
自適應(yīng)背景減法代碼
4. 高斯混合(MoG)
高斯混合是一種廣泛使用的背景建模方法,用于從靜態(tài)相機中檢測運動物體。
簡而言之,這種方法首先將每個像素建模為加權(quán)高斯的總和,其中權(quán)重定義了每個高斯的貢獻。擁有多個高斯而不是一個的直覺是一個像素可以代表許多對象(例如雪花和后面的建筑物)。通過使用以前的幀計算顏色直方圖,我們可以知道對象可能是背景或前景對象。
例如,當(dāng)我們得到一個具有大權(quán)重和小標(biāo)準(zhǔn)偏差的高斯時,這意味著所描述的對象經(jīng)常出現(xiàn)并且在幀之間沒有變化,因此它可能是背景的一部分。這就是算法的工作原理;每個輸入像素都會根據(jù)可用模型進行檢查。在匹配的情況下,我們更新模型的權(quán)重、均值和標(biāo)準(zhǔn)差,如果權(quán)重除以標(biāo)準(zhǔn)差很大,我們將像素分類為背景,否則分類為前景。
MAX_FRAMES = 1000
LEARNING_RATE = -1
fgbg = cv2.createBackgroundSubtractorMOG2()
cap = cv2.VideoCapture(0)
for t in range(MAX_FRAMES):
# Capture frame-by-frame
ret, frame = cap.read()
#Apply MOG
motion_mask = fgbg.a(chǎn)pply(frame, LEARNING_RATE)
#Get background
background = fgbg.getBackgroundImage()
# Display the motion mask and background
cv2.imshow('background', background)
cv2.imshow('Motion Mask', motion_mask)
混合高斯碼
原文標(biāo)題 : 運動檢測技術(shù)(OpenCV 上的代碼)
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
-
精彩回顧立即查看>> 【限時免費下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市