Мне нужно извлечь передний план из статического, известного фона (на моей веб-камере). Прямо сейчас я получаю средневзвешенное значение, используя первые 30 кадров фона, используя cv2.accumulateWeighted (), а затем сравниваю текущий кадр с фоном. (Все в оттенках серого)
Проблема заключается в том, что программа не понимает, что такое фон, и часто помечает части моего тела как фон (в основном это происходит, когда цвет фона близок к цвету моей кожи). Я считаю, что это из-за утечки цвета.
код
def getBackground(gray, aWeight=0.2):
global bg
if bg is None:
bg = gray.copy().astype(float)
return
cv2.accumulateWeighted(gray, bg, aWeight)
def extractForeground(gray, threshold=25):
global bg
diff = cv2.absdiff(bg.astype('uint8'), gray)
thresholded = cv2.threshold(diff,
threshold,
255,
cv2.THRESH_BINARY)[1]
kernel = np.ones((3,3),np.uint8)
thresholded = cv2.erode(thresholded,kernel,iterations = 2)
thresholded = cv2.dilate(thresholded,kernel,iterations = 2)
return thresholded
#global
bg = None
cap = cv2.VideoCapture(0)
numFrames = 0
while True:
ret,frame = cap.read()
frame = imutils.resize(frame, width = 700)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
if (numFrames<30):
getBackground(gray)
else:
fg = extractForeground(gray)
numFrames += 1
if cv2.waitKey(1) & 0xFF == ord('q'):
break
Мне нужно улучшить этот шаг, чтобы точно выделить передний план, даже если фон и цвета переднего плана относительно близки. Как я могу избежать утечки цвета?
Заранее спасибо