O filtro não funcionou muito bem, com muito ruído, em algumas horas chegando a aparecer quase toda a ponte. O meu código é o seguinte:
import cv2
import sys
import numpy as np
VIDEO = r'data/Ponte.mp4'
algorithym_types = ('KNN', 'GMG', 'CNT', 'MOG', 'MOG2')
algorithym_type = algorithym_types[3]
def Kernel(KERNEL_TYPE, x=3, y=3):
if KERNEL_TYPE == 'dilation':
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (x, y))
elif KERNEL_TYPE == 'opening':
kernel = np.ones((x, y), np.uint8)
elif KERNEL_TYPE == 'closing':
kernel = np.ones((x, y), np.uint8)
return kernel
def Filter(img, filter):
if filter == 'closing':
return cv2.morphologyEx(img, cv2.MORPH_CLOSE, Kernel('closing'), iterations=2)
elif filter == 'opening':
return cv2.morphologyEx(img, cv2.MORPH_OPEN, Kernel('opening'), iterations=2)
elif filter == 'dilation':
return cv2.dilate(img, Kernel('dilation'), iterations=2)
if filter == 'combine':
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, Kernel('closing'), iterations=2)
opening = cv2.morphologyEx(closing, cv2.MORPH_OPEN, Kernel('opening'), iterations=2)
dilation = cv2.dilate(opening, Kernel('dilation'), iterations=2)
return dilation
def subtractor(algorithym_type : str):
match algorithym_type:
case 'KNN':
return cv2.createBackgroundSubtractorKNN()
case 'GMG':
return cv2.bgsegm.createBackgroundSubtractorGMG()
case 'CNT':
return cv2.bgsegm.createBackgroundSubtractorCNT()
case 'MOG':
return cv2.bgsegm.createBackgroundSubtractorMOG()
case 'MOG2':
return cv2.createBackgroundSubtractorMOG2()
case _:
print('algoritmo não encontrado.')
sys.exit(1)
cap = cv2.VideoCapture(VIDEO)
background_subtractor = subtractor(algorithym_type)
def main():
while(cap.isOpened):
ok, frame = cap.read()
if not(ok):
print('Frames acabaram')
break
mask = background_subtractor.apply(frame)
mask_filter =Filter(mask, 'combine')
cars_after_mask = cv2.bitwise_and(frame, frame, mask=mask_filter)
cv2.imshow('Frame', frame)
cv2.imshow('MaskFilter', cars_after_mask)
if cv2.waitKey(1) & 0xFF == ord('c'):
break
main()