Как реализовать код для удаления тени из маски в opencv?
Я использую метод MoG в opencv, чтобы обнаружить движущийся объект в статической фоновой рамке, но он также обнаруживает тени. Я хочу удалить тени от маски. Я попытался использовать порог для серого цвета (поскольку shaodws отмечены серым цветом в маске), но порог также удаляет серую часть объекта. Я пытаюсь реализовать https://pdfs.semanticscholar.org/53e0/7f60d03461def8ed4f765f2a6b7dfc4bfbd0.pdf алгоритм этой статьи. Может кто-нибудь сказать мне, как реализовать это в Python?
import cv2
import numpy as np
cap = cv2.VideoCapture('TownCentreXVID.avi')
fgbg = cv2.createBackgroundSubtractorMOG2()
while(1):
_, frame = cap.read()
mask = fgbg.apply(frame)
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
window = cv2.namedWindow('Original', cv2.WINDOW_NORMAL| cv2.WINDOW_KEEPRATIO )
window = cv2.namedWindow('Mask', cv2.WINDOW_NORMAL| cv2.WINDOW_KEEPRATIO)
window = cv2.namedWindow('Opening', cv2.WINDOW_NORMAL| cv2.WINDOW_KEEPRATIO )
#window = cv2.namedWindow('Closing', cv2.WINDOW_NORMAL| cv2.WINDOW_KEEPRATIO)
cv2.imshow('Original',frame)
cv2.imshow('Mask',thresh)
cv2.imshow('Opening',opening)
#cv2.imshow('Closing',closing)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
cap.release()
1 ответ
Если вы используете BackgroundSubtractorMOG2
или же BackgroundSubtractorKNN
фон вычитатель, то вы можете легко установить ShadowValue
в false
или же 0
:
mog2->setShadowValue(0);
// Or
knn->setShadowValue(0);
И это удалит тень от маски.
С теневым значением = true
С теневым значением = ложь