我正在尝试创建一种算法,该算法可以接受实时视频流,检测运动并基于某个阈值仅保存某些帧。
在下面的代码中,我一直在使用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
该代码在某种程度上可以正常工作,它只保存许多确实有运动的帧。然而;根据阈值,照明条件和噪声,结果差异很大。有没有更好的方法可以做到这一点?实施中可能会出现什么问题?