Я пытаюсь создать алгоритм, который принимает поток живого видео, обнаруживает движение и на основе некоторого порога сохраняет только определенные кадры.
Я использовал openCV, следуя некоторым учебникам, как показано в коде ниже, чтобызахватывать информацию переднего плана, в которой информация переднего плана отображается белым цветом, а пиксели фона - черным. Затем я делаю простой подсчет количества черных пикселей, и если оно превышает определенное значение, я не сохраняю фрейм.
from __future__ import print_function
from cv2 import cv2 as cv
import argparse
import numpy as np
backSub = cv.createBackgroundSubtractorMOG2(100, 16, detectShadows = True)
capture = cv.VideoCapture(0)
count = 0
while True:
count += 1
ret, frame = capture.read()
if frame is None:
break
fgMask = backSub.apply(frame)
no_pixels = fgMask.shape[0]*fgMask.shape[1]
no_black_pixels = np.abs(cv.countNonZero(fgMask) - no_pixels)
#print('black: ' + str(no_black_pixels))
thres = 0.89
x = int(thres * no_pixels)
#print('threshold: ' + str(x))
if no_black_pixels <= x:
print('YES')
cv.imwrite("frame%d.jpg" % count, frame)
cv.rectangle(frame, (10, 2), (100,20), (255,255,255), -1)
cv.putText(frame, str(capture.get(cv.CAP_PROP_POS_FRAMES)), (15, 15),
cv.FONT_HERSHEY_SIMPLEX, 0.5 , (0,0,0))
cv.imshow('Frame', frame)
cv.imshow('FG Mask', fgMask)
key = cv.waitKey(1) & 0xFF
# if the `q` key is pressed, break from the lop
if key == ord("q"):
break
Код работает, когда он сохраняет только количество фреймов, которыеесть движение. Тем не мение;результаты довольно разные в зависимости от порога, условий освещения и шума. Есть ли лучший способ сделать это? и какие могут быть некоторые возможные проблемы с моей реализацией?