Как сохранить кадры, содержащие движение, из видеопотока python opencv - PullRequest
0 голосов
/ 26 октября 2019

Я пытаюсь создать алгоритм, который принимает поток живого видео, обнаруживает движение и на основе некоторого порога сохраняет только определенные кадры.

Я использовал 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

Код работает, когда он сохраняет только количество фреймов, которыеесть движение. Тем не мение;результаты довольно разные в зависимости от порога, условий освещения и шума. Есть ли лучший способ сделать это? и какие могут быть некоторые возможные проблемы с моей реализацией?

...