在OpenCV里使用背景去除

背景去除(Background subtraction)是一个基本的、广泛使用的技术,用它来生成一个前景掩模(把运动目标的像素生成二值化),以便把后面静态背景去掉。背景去除其实就是从图像里提取出静态的背景,然后把当前获取的图像减去背景,就可以得到前景,然后再把前景进行二值化。如下图所示:

在OpenCV里使用背景去除_第1张图片

在这里要构造背景的模型来识别出背景像素:

1)初始化背景模型。

2)用当前帧数据更新。

所谓的背景相减,是指把摄像头捕捉的图像第一帧作为背景,以后的每一帧都减去背景帧,这样减去之后剩下的就是多出来的特征物体(要侦测的物体)的部分。但是相减的部分也会对特征物体的灰阶值产生影响,一般是设定相关阈值要进行判断。

 

在这里学习OpenCV背景去除的使用:

1)使用cv::VideoCapture获取视频或图像序列

2)使用cv::BackgroundSubtractor类来创建和更新背景去除模型

3)使用cv::imshow显示前景掩模

 

下面的代码将使用 cv::BackgroundSubtractorMOG2 来生成前景的掩模,OpenCV提供了一个称为BackgroundSubtractor的类,在分割前景和背景时很方便。在OpenCV3中有三种背景分割器:K-Nearest(KNN)、Mixture of Gaussians(MOG2)、Geometric Multigid(GMG)。BackgroundSubtractor类是专门用于视频分析的,即BackgroundSubtractor类会对每帧的环境进行“学习”。BackgroundSubtractor类常用来对不同帧进行比较,并存储以前的帧,可按时间推移方法来提高运动分析的结果。

在OpenCV里使用背景去除_第2张图片

MOG2的继承图

Mog2用的是自适应的高斯混合模型(Adaptive GMM,Gaussian Mixture Model),在OpenCV中开源了的几种背景提取算法MOG,MOG2,GMG的测试程序结果中,MOG2确实在前景连续性及运算时间上都脱颖而出,后面会给出比较结果。这个是以高斯混合模型为基础的背景/前景分割算法。它是以 2004 年和 2006 年 Z.Zivkovic 的两篇文章为基础的。这个算法的一个特点是它为每一个像素选择一个合适数目的高斯分布。(上一个方法中我们使用是 K 高斯分布)。这样就会对由于亮度等发生变化引起的场景变化产生更好的适应。和前面一样我们需要创建一个背景对象。但在这里我们我们可以选择是否检测阴影。如果detectShadows = T rue(默认值),它就会检测并将影子标记出来,但是这样做会降低处理速度。影子会被标记为灰色。

例子:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import numpy as np
import cv2
from matplotlib import pyplot as plt

#backSub = cv2.createBackgroundSubtractorKNN()
backSub = cv2.createBackgroundSubtractorMOG2()

capture = cv2.VideoCapture(1)
if not capture.isOpened:
    print('Unable to open: ')
    exit(0)

while True:
    ret, frame = capture.read()
    if frame is None:
        break

    
    fgMask = backSub.apply(frame)
    

    
    cv2.rectangle(frame, (10, 2), (100,20), (255,255,255), -1)
    cv2.putText(frame, str(capture.get(cv2.CAP_PROP_POS_FRAMES)), (15, 15),
               cv2.FONT_HERSHEY_SIMPLEX, 0.5 , (0,0,0))   

    
    cv2.imshow('Frame', frame)
    cv2.imshow('FG Mask', fgMask)
    

    keyboard = cv2.waitKey(1)
    if keyboard == ord('q') or  keyboard == ord('Q'):
        break
    
capture.release()
cv2.destroyAllWindows()

结果输出如下:

在OpenCV里使用背景去除_第3张图片

在这里可以看到生成前景运动物体的掩模,只要与原图像进行与的操作就得到前景物体了。这里使用了电脑的第二个摄像头,如果想使用第一个把cv2.VideoCapture(1)里的1变成0,另外这里也使用了自动的学习速率,如果想改变可以在fgMask = backSub.apply(frame)语句里改变。

https://blog.csdn.net/caimouse/article/details/51749579

你可能感兴趣的:(OpenCV)