【OpenCV】79 视频分析—背景/前景提取

79 视频分析—背景/前景提取

代码

import numpy as np
import cv2 as cv

cap = cv.VideoCapture('../images/color_object.mp4')
fgbg = cv.createBackgroundSubtractorMOG2(history=500, varThreshold=1000, detectShadows=False)
while True:
    ret, frame = cap.read()
    fgmask = fgbg.apply(frame)
    background = fgbg.getBackgroundImage()
    cv.imshow('input', frame)
    cv.imshow('mask',fgmask)
    cv.imshow('background', background)
    k = cv.waitKey(10)&0xff
    if k == 27:
        break
cap.release()
cv.destroyAllWindows()

实验结果

在这里插入图片描述

解释

视频场景分析中最常用的技术之一就是通过背景消除来提取前景移动对象,得到前景的对象mask图像,最常用的背景消除技术就是通过帧差相减,用前面一帧作为背景图像,与当前帧进行相减,不过这种方法对光照与噪声影响非常敏感,所有好的办法是通过对前面一系列帧提取背景模型进行相减,OpenCV中实现的背景模型提取算法有两种,一种是基于高斯混合模型GMM实现的背景提取,另外一种是基于最近邻KNN实现的。都有相关的API可以供开发者使用。相关API:

retval = cv.createBackgroundSubtractorMOG2([, history[, varThreshold[, detectShadows]]])
  • history表示过往帧数,500帧,选择history = 1就变成两帧差
  • varThreshold表示像素与模型之间的马氏距离,值越大,只有那些最新的像素会被归到前景,值越小前景对光照越敏感。
  • detectShadows 是否保留阴影检测,选择False这样速度快点。
retval = cv.createBackgroundSubtractorKNN([, history[, dist2Threshold[, detectShadows]]])
  • history表示过往帧数,500帧,选择history = 1就变成两帧差
  • varThreshold表示像素与模型之间的马氏距离,值越大,只有那些最新的像素会被归到前景,值越小前景对光照越敏感。
  • detectShadows 是否保留阴影检测,选择False这样速度快点。

背景消除的基本原理见图一:
在这里插入图片描述


所有内容均来源于贾志刚老师的知识星球——OpenCV研习社,本文为个人整理学习,已获得贾老师授权,有兴趣、有能力的可以加入贾老师的知识星球进行深入学习。
在这里插入图片描述

发布了111 篇原创文章 · 获赞 0 · 访问量 1671

猜你喜欢

转载自blog.csdn.net/liu_taiting/article/details/104961395
79
今日推荐