作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道 cv2.createBackgroundSubtractorMOG2()
我们可以使用基于每 500 帧(默认)的背景估计方法减去前景蒙版。但是 怎么样?我已经有背景图并且只想在每一帧中使用该图片减去前景?我正在尝试的是这样的:
import numpy as np
import cv2
video = "xx.avi"
cap = cv2.VideoCapture(video)
bg = cv2.imread("bg.png")
while True:
ret, frame = cap.read()
original_frame = frame.copy()
if ret:
# get foremask?
fgmask = frame - bg
# filter kernel for denoising:
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
opening = cv2.morphologyEx(fgmask, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel)
# Dilate to merge adjacent blobs
dilation = cv2.dilate(closing, kernel, iterations = 2)
# show fg:dilation
cv2.imshow('fg mask', dilation)
cv2.imshow('original', original_frame)
k = cv2.waitKey(30) & 0xff
if k == 27:
cap.release()
cv2.destroyAllWindows()
break
else:
break
frame = frame - bg
.我怎样才能得到正确的前景蒙版?
最佳答案
您将获得彩色图像,因为您要减去 2 个彩色图像,因此您在每个像素上获得的颜色是两个图像之间每个 channel (B、G 和 R)上的差异。
为了执行背景减法,正如 dhanushka 评论的那样,最简单的选择是使用 MOG2 并将您的背景图像转发一些(500)帧,以便它将其作为背景学习。 MOG2 旨在使用高斯模型学习每个像素颜色的可变性,因此如果您始终输入相同的图像,它不会学习到这一点。无论如何,我认为它应该适用于您打算做的事情。
这种方法的好处是 MOG2 会处理更多的事情,比如随着时间的推移更新模型、处理阴影等等。
另一种选择是按照您尝试的方式实现您自己的背景减法方法。
因此,如果您想对其进行测试,您需要将 fgmask 彩色图像转换为您可以轻松阈值并确定每个像素是背景还是前景的图像。一个简单的选择是将其转换为灰度,然后应用一个简单的阈值,阈值越低,减法方法越“敏感”,(使用阈值),即:
...
# get foremask?
fgmask = frame - bg
gray_image = cv2.cvtColor(fgmask, cv2.COLOR_BGR2GRAY)
thresh = 20
im_bw = cv2.threshold(im_gray, thresh, 255, cv2.THRESH_BINARY)[1]
# filter kernel for denoising:
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
opening = cv2.morphologyEx(im_bw, cv2.MORPH_OPEN, kernel)
...
关于python - 已有背景图像时如何获取前景蒙版,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51098001/
我是一名优秀的程序员,十分优秀!