如何保存包含来自视频流的运动的帧python opencv

时间:2019-10-26 11:03:34

标签: python opencv motion-detection

我正在尝试创建一种算法,该算法可以接受实时视频流,检测运动并基于某个阈值仅保存某些帧。

在下面的代码中,我一直在使用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

该代码在某种程度上可以正常工作,它只保存许多确实有运动的帧。然而;根据阈值,照明条件和噪声,结果差异很大。有没有更好的方法可以做到这一点?实施中可能会出现什么问题?

0 个答案:

没有答案