訂閱
糾錯
加入自媒體

運動檢測技術(OpenCV 上的代碼)

近年來,運動檢測技術已成為計算機視覺的重要研究領域之一。視頻序列上已經發(fā)明了許多方法,其中一些方法比其他方法更好。在本文中,我們將解釋并在 OpenCV 上實現一些基本方法。

1. 幀差分

幀差分背后的想法非常簡單。我們逐像素檢查兩個視頻幀之間的差異。如果有運動,像素值就會發(fā)生變化,因此我們將獲得運動圖。

很簡單對嗎?但是,由于噪聲(例如照明的變化)可能會發(fā)生一些像素值變化,為了避免在我們的運動蒙版中捕獲噪聲,我們應用了一個閾值,該閾值基本上會突出強度方面的大變化并丟棄小的變化。請注意,閾值沒有正確的選擇,通常是憑經驗完成的。

現在我們理解了這個概念,讓我們展示一些代碼:

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.append(frame_gray)

   if t >= N:

       #D(N) = || I(t) - I(t+N) || = || I(t-N) - I(t) ||

       diff = cv2.absdiff(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 結合以確保我們始終檢測到一個對象而不是它的重影。

幀差分的另一個問題是,當對象停止移動時,它不再被檢測到。這顯然取決于我們想要完成的任務,但是假設我們想要繼續(xù)檢測移動物體,即使它停止了一段時間。這個問題的一個答案是背景減法技術。

2. 背景減法

背景減法是一種廣泛使用的方法,用于檢測靜態(tài)攝像機幀序列中的移動對象。它需要一個參考圖像來播放背景(通常在沒有對象的情況下獲取)。然后我們計算當前幀和背景幀(參考圖像)之間的差異。其主要任務是檢測通常代表運動物體的前景。

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.absdiff(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. 自適應背景減法

這種方法基本上結合了之前的兩種技術,通過引入學習率 λ 來充分利用兩者。在每個時間步,我們對傳入圖像和先前背景的貢獻進行加權以構建新背景。

例如,如果我們設置 λ=0.1,則在更新背景幀之前需要 10 幀(換句話說,前景對象將被吸收到背景中)。而對于 λ=0.5,我們有更快的更新(更新前只需要 2 幀)。請注意,選擇 λ 沒有規(guī)則,它是憑經驗完成的,因為它取決于我們正在處理的任務和環(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.absdiff(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)

自適應背景減法代碼

4. 高斯混合(MoG)

高斯混合是一種廣泛使用的背景建模方法,用于從靜態(tài)相機中檢測運動物體。

簡而言之,這種方法首先將每個像素建模為加權高斯的總和,其中權重定義了每個高斯的貢獻。擁有多個高斯而不是一個的直覺是一個像素可以代表許多對象(例如雪花和后面的建筑物)。通過使用以前的幀計算顏色直方圖,我們可以知道對象可能是背景或前景對象。

例如,當我們得到一個具有大權重和小標準偏差的高斯時,這意味著所描述的對象經常出現并且在幀之間沒有變化,因此它可能是背景的一部分。這就是算法的工作原理;每個輸入像素都會根據可用模型進行檢查。在匹配的情況下,我們更新模型的權重、均值和標準差,如果權重除以標準差很大,我們將像素分類為背景,否則分類為前景。

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.apply(frame, LEARNING_RATE)

   #Get background

   background = fgbg.getBackgroundImage()

   # Display the motion mask and background

   cv2.imshow('background', background)

   cv2.imshow('Motion Mask', motion_mask)

混合高斯碼

image.png


       原文標題 : 運動檢測技術(OpenCV 上的代碼)

聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關注公眾號
OFweek人工智能網
獲取更多精彩內容
文章糾錯
x
*文字標題:
*糾錯內容:
聯系郵箱:
*驗 證 碼:

粵公網安備 44030502002758號