背景减法是一种从背景中分离出前景元素的技术,通过生成前景蒙版来完成。该技术用于从静态摄像机中检测动态移动的物体。背景减法技术对于目标跟踪很重要。有几种背景减法技术
在本文中,我们将讨论Running Average的概念。函数的运行平均值用于将前景与背景分开。在这个概念中,视频序列是在一组特定的帧上进行分析的。在此帧序列期间,计算当前帧和前一帧的运行平均值。这为我们提供了背景模型,并且在视频排序期间引入的任何新对象都成为前景的一部分。然后,当前帧将新引入的对象与背景一起保存。然后计算背景模型(它是时间的函数)和当前帧(新引入的对象)之间的绝对差异。使用下面给出的等式计算运行平均值:
先决条件:
- 用于输入的工作网络摄像头或摄像头模块。
- 下载Python 3.x、Numpy 和 OpenCV 2.7.x 版本。检查您的操作系统是否兼容 32 位或 64 位并进行相应安装。
- 查看numpy和OpenCV的运行状态
运行平均方法如何工作?
该程序的目标是根据从参考帧和当前帧获得的差异来检测活动对象。我们不断地将每一帧输入给给定的函数,该函数不断地寻找所有帧的平均值。然后我们计算帧之间的绝对差异。
使用的函数是cv2.accumulateWeighted() 。
cv2.accumulateWeighted(src, dst, alpha)
在这个函数中传递的参数是:
- src : 源图像。图像可以是彩色或灰度图像以及 8 位或 32 位浮点。
- dst :累加器或目标图像。它是 32 位或 64 位浮点数。
注意:它应该具有与源图像相同的通道。此外,最初应预先声明 dst 的值。 - alpha :输入图像的权重。 Alpha 决定更新的速度。如果您为此变量设置一个较低的值,则会在大量先前的帧上执行运行平均,反之亦然。
代码:
# Python program to illustrate
# Background subtraction using
# concept of Running Averages
# organize imports
import cv2
import numpy as np
# capture frames from a camera
cap = cv2.VideoCapture(0)
# read the frames from the camera
_, img = cap.read()
# modify the data type
# setting to 32-bit floating point
averageValue1 = np.float32(img)
# loop runs if capturing has been initialized.
while(1):
# reads frames from a camera
_, img = cap.read()
# using the cv2.accumulateWeighted() function
# that updates the running average
cv2.accumulateWeighted(img, averageValue1, 0.02)
# converting the matrix elements to absolute values
# and converting the result to 8-bit.
resultingFrames1 = cv2.convertScaleAbs(averageValue1)
# Show two output windows
# the input / original frames window
cv2.imshow('InputWindow', img)
# the window showing output of alpha value 0.02
cv2.imshow('averageValue1', resultingFrames1)
# Wait for Esc key to stop the program
k = cv2.waitKey(30) & 0xff
if k == 27:
break
# Close the window
cap.release()
# De-allocate any associated memory usage
cv2.destroyAllWindows()
输出 :
正如我们在下面可以清楚地看到的,手挡住了背景视图。
现在,我们摇晃前景对象,即我们的手。我们开始挥手。
运行平均值在下方清楚地显示了背景,使用 alpha 0.02 的运行平均值将其捕捉为透明的手,主要强调背景
或者,我们可以将cv.RunningAvg()用于相同的任务,其参数与cv2.accumulateweighted()的参数含义相同。
cv.RunningAvg(image, acc, alpha)
参考资料:
- https://docs.opencv.org/2.4/modules/imgproc/doc/motion_analysis_and_object_tracking.html
- https://en.wikipedia.org/wiki/Foreground_detection
- https://docs.opencv.org/3.2.0/d1/dc5/tutorial_background_subtraction.html