gpt4 book ai didi

python - 已有背景图像时如何获取前景蒙版

转载 作者:行者123 更新时间:2023-12-02 17:35:50 24 4
gpt4 key购买 nike

我知道 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com