Комментарии 8
Разве не удивительно, что мы можем достичь всего этого с помощью простой обработки изображений и OpenCV?
Разве не для таких задач она создавалась?
Можно вообще контуры не использовать.
Тот же результат проще достигается с использованием функции для связных компонент cv2.connectedComponentsWithStats и последующей фильтрацией по площади, причем BoundungBox уже будет посчитан автоматически.
Давайте сделаем скидку на то, что это перевод, а переводчик, как известно, аналитикой не блещет. Однако, стоит отметить, что OpenCV в своем составе имеет готоые к использованию функции вычисления фона/объектов.
Например, MOG2:
https://dev.to/azure/opencv-background-subtraction-in-a-camera-feed-using-mog2-3dg8
import cv2
backSub_mog = cv2.createBackgroundSubtractorMOG2()
# open camera
cap = cv2.VideoCapture(1)
while True:
# read image
ret, img = cap.read()
#resize office to 640x480
img = cv2.resize(img, (320, 240))
imgNoBg = backSub_mog.apply(img)
# show both images
cv2.imshow('office',img)
cv2.imshow('office no bg MOG2',imgNoBg)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# close camera
cap.release()
cv2.destroyAllWindows()
И, например, MOG2 очень неплохо работает на CUDA - 1000 FPS на 4060 Laptop легко. В работе: https://www.youtube.com/watch?v=P9w-WS6HLew&ab_channel=IvanKud
Интересно, а что будет при наличии дыма местами? Контраст-то падает.
Есть ещё одна проблема - сжатие видеопотока, из-за этого фон каждый раз чуть-чуть разный
Обнаружение движущихся объектов с помощью OpenCV с использованием обнаружения контуров и вычитания фона