OpenCV图像处理-视频背景去除和前景ROI提取

电脑杂谈  发布时间:2020-07-02 12:25:32  来源:网络整理

视频前景提取_视频前景提取_提取视频中的音乐

✔️背景减法是许多基于计算机视觉的任务中的主要预处理步骤.

✔️如果有完整的静止背景帧,则可以通过帧差方法计算像素差以获得前景对象. 但是在大多数情况下,没有这样的图像,因此您需要从任何图像中提取背景. 当移动的对象具有阴影时,由于阴影也在移动,因此情况变得更加复杂. 为此,引入了背景减法算法. 通过这种方法,可以将运动对象的前景与视频分离开来,从而达到目标检测的目的.

✔️OpenCV中常用的两种背景去除方法,一种是基于高斯混合模型GMM的背景提取,另一种是基于最近邻KNN的.

背景:

视频前景提取_视频前景提取_提取视频中的音乐

API:

cv2.createBackgroundSubtractorMOG2(
int  history = 500, 
double  varThreshold = 16,
bool  detectShadows = true 
)

参数解释如下: -history表示过去的帧数,即500帧,选择history = 1视频前景提取,然后变为两个帧,差varThreshold表示像素与模型之间的马氏距离. 被分类为前景时,该值越小,前景对光线越敏感. -detectShadows是否保留阴影检测视频前景提取,请更快地选择False.

背景:

KNN算法(基于K近邻的背景/前景分割算法). Zoran Zivkovic和Ferdinand van der Heijden于2006年在论文“针对背景相减的任务中对每个图像像素的高效自适应密度估计”中提出了这一建议.

API:

提取视频中的音乐_视频前景提取_视频前景提取

cv2.createBackgroundSubtractorKNN()

✔️参考官方Opencv示例中的视频vtest.mp4以实现背景去除和ROI行人提取.

✔️主要通过在视频中对背景进行建模以消除背景,生成蒙版图像并通过分析蒙版二进制图像来提取前景活动对象的区域. 整个步骤如下: 1.初始化背景建模对象GMM 2.读取视频帧3.使用背景建模删除生成的蒙版4.对蒙版进行轮廓分析以提取ROI 5.绘制ROI对象

import numpy as np
import cv2
# read the video
cap = cv2.VideoCapture(vtest.avi)
# create the subtractor
fgbg = cv2.createBackgroundSubtractorMOG2(
    history=500, varThreshold=100, detectShadows=False)
def getPerson(image, opt=1):
    # get the front mask
    mask = fgbg.apply(frame)
    # eliminate the noise
    line = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 5), (-1, -1))
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, line)
    cv2.imshow(mask, mask)
    # find the max area contours
    out, contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for c in range(len(contours)):
        area = cv2.contourArea(contours[c])
        if area < 150:
            continue
        rect = cv2.minAreaRect(contours[c])
        cv2.ellipse(image, rect, (0, 255, 0), 2, 8)
        cv2.circle(image, (np.int32(rect[0][0]), np.int32(rect[0][1])), 2, (255, 0, 0), 2, 8, 0)
    return image, mask
while True:
    ret, frame = cap.read()
    cv2.imwrite(input.png, frame)
    cv2.imshow(input, frame)
    result, m_ = getPerson(frame)
    cv2.imshow(result, result)
    k = cv2.waitKey(50)&0xff
    if k == 27:
        cv2.imwrite(result.png, result)
        cv2.imwrite(mask.png, m_)
        break
cap.release()
cv2.destroyAllWindows()

提取视频中的音乐_视频前景提取_视频前景提取

输入

前

提取视频中的音乐_视频前景提取_视频前景提取

结果

------------------------------------------可爱的分隔线-- ----------------------------------------

更多Opencv教程可以跟随github,中文和英语上的opencv教程WelcomeStar❤️❤️❤️

github.com

-OpenCv官方网站

-Python OpenCV 3使用背景减法进行目标检测


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/bofangqi/article-265763-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...