運(yùn)動(dòng)檢測(cè)技術(shù)(OpenCV 上的代碼)
近年來(lái),運(yùn)動(dòng)檢測(cè)技術(shù)已成為計(jì)算機(jī)視覺的重要研究領(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)注意,閾值沒有正確的選擇,通常是憑經(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 開發(fā)的一種解決方案是雙重差分,我們?cè)跁r(shí)間 t 和 t-1 以及 t-1 和 t-2 之間的兩個(gè)幀之間操作閾值差異,然后將它們與邏輯 AND 結(jié)合以確保我們始終檢測(cè)到一個(gè)對(duì)象而不是它的重影。
幀差分的另一個(gè)問題是,當(dāng)對(duì)象停止移動(dòng)時(shí),它不再被檢測(cè)到。這顯然取決于我們想要完成的任務(wù),但是假設(shè)我們想要繼續(xù)檢測(cè)移動(dòng)物體,即使它停止了一段時(shí)間。這個(gè)問題的一個(gè)答案是背景減法技術(shù)。
2. 背景減法
背景減法是一種廣泛使用的方法,用于檢測(cè)靜態(tài)攝像機(jī)幀序列中的移動(dòng)對(duì)象。它需要一個(gè)參考圖像來(lá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"問題,這意味著如果背景物體(屬于參考圖像的物體)移動(dòng),則同時(shí)檢測(cè)到真實(shí)物體及其重影.
在這種情況下,我們遇到了與幀差分相反的問題:“如果我們想停止檢測(cè)前景對(duì)象并將其吸收到背景中怎么辦?”
3. 自適應(yīng)背景減法
這種方法基本上結(jié)合了之前的兩種技術(shù),通過引入學(xué)習(xí)率 λ 來(lái)充分利用兩者。在每個(gè)時(shí)間步,我們對(duì)傳入圖像和先前背景的貢獻(xiàn)進(jìn)行加權(quán)以構(gòu)建新背景。
例如,如果我們?cè)O(shè)置 λ=0.1,則在更新背景幀之前需要 10 幀(換句話說,前景對(duì)象將被吸收到背景中)。而對(duì)于 λ=0.5,我們有更快的更新(更新前只需要 2 幀)。請(qǐng)注意,選擇 λ 沒有規(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è)的直覺是一個(gè)像素可以代表許多對(duì)象(例如雪花和后面的建筑物)。通過使用以前的幀計(jì)算顏色直方圖,我們可以知道對(duì)象可能是背景或前景對(duì)象。
例如,當(dāng)我們得到一個(gè)具有大權(quán)重和小標(biāo)準(zhǔn)偏差的高斯時(shí),這意味著所描述的對(duì)象經(jīng)常出現(xiàn)并且在幀之間沒有變化,因此它可能是背景的一部分。這就是算法的工作原理;每個(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è)字
圖片新聞
-
馬云重返一線督戰(zhàn),阿里重啟創(chuàng)始人模式
-
機(jī)器人奧運(yùn)會(huì)戰(zhàn)報(bào):宇樹機(jī)器人摘下首金,天工Ultra搶走首位“百米飛人”
-
存儲(chǔ)圈掐架!江波龍起訴佰維,索賠121萬(wàn)
-
長(zhǎng)安汽車母公司突然更名:從“中國(guó)長(zhǎng)安”到“辰致科技”
-
豆包前負(fù)責(zé)人喬木出軌BP后續(xù):均被辭退
-
字節(jié)AI Lab負(fù)責(zé)人李航卸任后返聘,Seed進(jìn)入調(diào)整期
-
員工持股爆雷?廣汽埃安緊急回應(yīng)
-
中國(guó)“智造”背后的「關(guān)鍵力量」
最新活動(dòng)更多
-
10月23日火熱報(bào)名中>> 2025是德科技創(chuàng)新技術(shù)峰會(huì)
-
10月23日立即報(bào)名>> Works With 開發(fā)者大會(huì)深圳站
-
10月24日立即參評(píng)>> 【評(píng)選】維科杯·OFweek 2025(第十屆)物聯(lián)網(wǎng)行業(yè)年度評(píng)選
-
即日-11.25立即下載>>> 費(fèi)斯托白皮書《柔性:汽車生產(chǎn)未來(lái)的關(guān)鍵》
-
11月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
12月18日立即報(bào)名>> 【線下會(huì)議】OFweek 2025(第十屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
推薦專題
-
10 大模型的盡頭是開源
- 1 特斯拉工人被故障機(jī)器人打成重傷,索賠3.6億
- 2 【行業(yè)深度研究】退居幕后四年后,張一鳴終于把算法公司變成AI公司?
- 3 人形機(jī)器人廠商,正在批量復(fù)刻宇樹G1
- 4 AI 時(shí)代,阿里云想當(dāng)“安卓” ,那誰(shuí)是“蘋果”?
- 5 華為公布昇騰芯片三年計(jì)劃,自研HBM曝光
- 6 硬剛英偉達(dá)!華為發(fā)布全球最強(qiáng)算力超節(jié)點(diǎn)和集群
- 7 機(jī)器人9月大事件|3家國(guó)產(chǎn)機(jī)器人沖刺IPO,行業(yè)交付與融資再創(chuàng)新高!
- 8 谷歌“香蕉”爆火啟示:國(guó)產(chǎn)垂類AI的危機(jī)還是轉(zhuǎn)機(jī)?
- 9 00后華裔女生靠?jī)刹緼I電影狂賺7.8億人民幣,AI正式進(jìn)軍好萊塢
- 10 美光:AI Capex瘋投不止,終于要拉起存儲(chǔ)超級(jí)周期了?