運(yùn)動(dòng)檢測(cè)技術(shù)(OpenCV 上的代碼)
近年來(lái),運(yùn)動(dòng)檢測(cè)技術(shù)已成為計(jì)算機(jī)視覺(jué)的重要研究領(lǐng)域之一。視頻序列上已經(jīng)發(fā)明了許多方法,其中一些方法比其他方法更好。在本文中,我們將解釋并在 OpenCV 上實(shí)現(xiàn)一些基本方法。
1. 幀差分
幀差分背后的想法非常簡(jiǎn)單。我們逐像素檢查兩個(gè)視頻幀之間的差異。如果有運(yùn)動(dòng),像素值就會(huì)發(fā)生變化,因此我們將獲得運(yùn)動(dòng)圖。
很簡(jiǎn)單對(duì)嗎?但是,由于噪聲(例如照明的變化)可能會(huì)發(fā)生一些像素值變化,為了避免在我們的運(yùn)動(dòng)蒙版中捕獲噪聲,我們應(yīng)用了一個(gè)閾值,該閾值基本上會(huì)突出強(qiáng)度方面的大變化并丟棄小的變化。請(qǐng)注意,閾值沒(méi)有正確的選擇,通常是憑經(jīng)驗(yàn)完成的。
現(xiàn)在我們理解了這個(gè)概念,讓我們展示一些代碼:
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)
這種方法具有計(jì)算性能,但是它存在兩個(gè)主要缺點(diǎn):前景光圈和由幀速率和物體速度引起的重影。
Kameda 和 Minoh 開(kāi)發(fā)的一種解決方案是雙重差分,我們?cè)跁r(shí)間 t 和 t-1 以及 t-1 和 t-2 之間的兩個(gè)幀之間操作閾值差異,然后將它們與邏輯 AND 結(jié)合以確保我們始終檢測(cè)到一個(gè)對(duì)象而不是它的重影。
幀差分的另一個(gè)問(wèn)題是,當(dāng)對(duì)象停止移動(dòng)時(shí),它不再被檢測(cè)到。這顯然取決于我們想要完成的任務(wù),但是假設(shè)我們想要繼續(xù)檢測(cè)移動(dòng)物體,即使它停止了一段時(shí)間。這個(gè)問(wèn)題的一個(gè)答案是背景減法技術(shù)。
2. 背景減法
背景減法是一種廣泛使用的方法,用于檢測(cè)靜態(tài)攝像機(jī)幀序列中的移動(dòng)對(duì)象。它需要一個(gè)參考圖像來(lái)播放背景(通常在沒(méi)有對(duì)象的情況下獲。。然后我們計(jì)算當(dāng)前幀和背景幀(參考圖像)之間的差異。其主要任務(wù)是檢測(cè)通常代表運(yùn)動(dòng)物體的前景。
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)
背景減法代碼
如果對(duì)象的顏色與背景框不同,這種方法可以獲得很好的效果。然而,像幀差分一樣,它也有一些主要的缺點(diǎn)。毋庸置疑,它對(duì)光照變化和相機(jī)運(yùn)動(dòng)高度敏感,它還有一個(gè)“waking person"問(wèn)題,這意味著如果背景物體(屬于參考圖像的物體)移動(dòng),則同時(shí)檢測(cè)到真實(shí)物體及其重影.
在這種情況下,我們遇到了與幀差分相反的問(wèn)題:“如果我們想停止檢測(cè)前景對(duì)象并將其吸收到背景中怎么辦?”
3. 自適應(yīng)背景減法
這種方法基本上結(jié)合了之前的兩種技術(shù),通過(guò)引入學(xué)習(xí)率 λ 來(lái)充分利用兩者。在每個(gè)時(shí)間步,我們對(duì)傳入圖像和先前背景的貢獻(xiàn)進(jìn)行加權(quán)以構(gòu)建新背景。
例如,如果我們?cè)O(shè)置 λ=0.1,則在更新背景幀之前需要 10 幀(換句話說(shuō),前景對(duì)象將被吸收到背景中)。而對(duì)于 λ=0.5,我們有更快的更新(更新前只需要 2 幀)。請(qǐng)注意,選擇 λ 沒(méi)有規(guī)則,它是憑經(jīng)驗(yàn)完成的,因?yàn)樗Q于我們正在處理的任務(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)相機(jī)中檢測(cè)運(yùn)動(dòng)物體。
簡(jiǎn)而言之,這種方法首先將每個(gè)像素建模為加權(quán)高斯的總和,其中權(quán)重定義了每個(gè)高斯的貢獻(xiàn)。擁有多個(gè)高斯而不是一個(gè)的直覺(jué)是一個(gè)像素可以代表許多對(duì)象(例如雪花和后面的建筑物)。通過(guò)使用以前的幀計(jì)算顏色直方圖,我們可以知道對(duì)象可能是背景或前景對(duì)象。
例如,當(dāng)我們得到一個(gè)具有大權(quán)重和小標(biāo)準(zhǔn)偏差的高斯時(shí),這意味著所描述的對(duì)象經(jīng)常出現(xiàn)并且在幀之間沒(méi)有變化,因此它可能是背景的一部分。這就是算法的工作原理;每個(gè)輸入像素都會(huì)根據(jù)可用模型進(jìn)行檢查。在匹配的情況下,我們更新模型的權(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)題 : 運(yùn)動(dòng)檢測(cè)技術(shù)(OpenCV 上的代碼)

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
6月20日立即下載>> 【白皮書(shū)】精準(zhǔn)測(cè)量 安全高效——福祿克光伏行業(yè)解決方案
-
7月3日立即報(bào)名>> 【在線會(huì)議】英飛凌新一代智能照明方案賦能綠色建筑與工業(yè)互聯(lián)
-
7月22-29日立即報(bào)名>> 【線下論壇】第三屆安富利汽車(chē)生態(tài)圈峰會(huì)
-
7.30-8.1火熱報(bào)名中>> 全數(shù)會(huì)2025(第六屆)機(jī)器人及智能工廠展
-
7月31日免費(fèi)預(yù)約>> OFweek 2025具身機(jī)器人動(dòng)力電池技術(shù)應(yīng)用大會(huì)
-
免費(fèi)參會(huì)立即報(bào)名>> 7月30日- 8月1日 2025全數(shù)會(huì)工業(yè)芯片與傳感儀表展
推薦專題
- 1 AI 眼鏡讓百萬(wàn) APP「集體失業(yè)」?
- 2 大廠紛紛入局,百度、阿里、字節(jié)搶奪Agent話語(yǔ)權(quán)
- 3 深度報(bào)告|中國(guó)AI產(chǎn)業(yè)正在崛起成全球力量,市場(chǎng)潛力和關(guān)鍵挑戰(zhàn)有哪些?
- 4 上海跑出80億超級(jí)獨(dú)角獸:獲上市公司戰(zhàn)投,干人形機(jī)器人
- 5 國(guó)家數(shù)據(jù)局局長(zhǎng)劉烈宏調(diào)研格創(chuàng)東智
- 6 下一代入口之戰(zhàn):大廠為何紛紛押注智能體?
- 7 百億AI芯片訂單,瘋狂傾銷中東?
- 8 Robotaxi新消息密集釋放,量產(chǎn)元年誰(shuí)在領(lǐng)跑?
- 9 格斗大賽出圈!人形機(jī)器人致命短板曝光:頭腦過(guò)于簡(jiǎn)單
- 10 “搶灘”家用機(jī)器人領(lǐng)域,聯(lián)通、海爾、美的等紛紛入局