[英]How to set background subtraction to stable object
嗨,我正在寫一篇論文,我正在尋找一種方法如何將人類物體轉換為房間中的白色像素。 這里我使用背景減法來檢測物體。 問題是背景減法通過不斷更新每一幀的背景來工作,所以長時間停留在原地的物體將被視為背景。 如何讓我的算法僅在空間為空時將每一幀與第一幀進行比較,這樣如果每幀與第一幀之間存在差異,它將被視為一個對象? 我正在考慮將第一幀更改為背景圖像並將其與每一幀進行比較,這樣如果與我設置的背景有任何不同,它將被視為一個對象。 怎么做 ?? 哦,是的,這是我的代碼
import numpy as np
import cv2
import datetime
from playsound import playsound
# Mengubah ukuran
dim = (480, 360)
# Menangkap citra pada video
cap = cv2.VideoCapture('sample1.mp4')
# background subtraction
fgbg = cv2.createBackgroundSubtractorMOG2(500,16,True)
# Structuring elements for morphographic filters
kernelOp = np.ones((3, 3), np.uint8)
kernelCl = np.ones((11, 11), np.uint8)
# Read an image of the video source
ret, frame = cap.read()
frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)
# Read an image of the video source
ret, frame = cap.read()
while cap.isOpened():
# Read an image of the video source
ret, frame = cap.read()
frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)
# Apply background subtraction
fgmask2 = fgbg.apply(frame)
# eliminate shadows (gray color)
ret, imBin2 = cv2.threshold(fgmask2, 254, 255, cv2.THRESH_BINARY)
mask2 = cv2.morphologyEx(imBin2, cv2.MORPH_OPEN, kernelOp)
mask2 = cv2.morphologyEx(mask2, cv2.MORPH_CLOSE, kernelCl)
cv2.imshow('Original Video', frame) # display original video
cv2.imshow('Masked Video', mask2) # display B & W video
# press ESC to exit
k = cv2.waitKey(30) & 0xff
if k == 27:
break
# End of while(cap.isOpened())
# release video and close all windows
cap.release()
cv2.destroyAllWindows()
您擁有視頻的初始幀,但您在while
循環中分配了相同的變量,因此它被覆蓋。 也更好地工作灰度。
為初始幀分配一個不同的變量:
ret, initial_frame = cap.read()
initial_frame = cv2.resize(initial_frame, dim, interpolation=cv2.INTER_AREA)
initial_frame_gray = cv2.cvtColor(initial_frame, cv2.COLOR_BGR2GRAY)
在while
循環中,將視頻逐幀讀取為灰度,並從initial_frame_gray
中減去每一幀:
while cap.isOpened():
# Read an image of the video source
ret, frame = cap.read()
frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
由於您使用的是灰度,您可以使用cv2.subtract()
來查找當前幀和初始幀之間的差異。 它還確保像素強度保持在 [0-255] 范圍內
difference = cv2.subtract(initial_frame_gray , frame_gray )
從這里開始,您可以執行后續操作(消除陰影、形態等)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.