[英]How to set background subtraction to stable object
嗨,我正在写一篇论文,我正在寻找一种方法如何将人类物体转换为房间中的白色像素。 这里我使用背景减法来检测物体。 问题是背景减法通过不断更新每一帧的背景来工作,所以长时间停留在原地的物体将被视为背景。 如何让我的算法仅在空间为空时将每一帧与第一帧进行比较,这样如果每帧与第一帧之间存在差异,它将被视为一个对象? 我正在考虑将第一帧更改为背景图像并将其与每一帧进行比较,这样如果与我设置的背景有任何不同,它将被视为一个对象。 怎么做 ?? 哦,是的,这是我的代码
import numpy as np
import cv2
import datetime
from playsound import playsound
# Mengubah ukuran
dim = (480, 360)
# Menangkap citra pada video
cap = cv2.VideoCapture('sample1.mp4')
# background subtraction
fgbg = cv2.createBackgroundSubtractorMOG2(500,16,True)
# Structuring elements for morphographic filters
kernelOp = np.ones((3, 3), np.uint8)
kernelCl = np.ones((11, 11), np.uint8)
# Read an image of the video source
ret, frame = cap.read()
frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)
# Read an image of the video source
ret, frame = cap.read()
while cap.isOpened():
# Read an image of the video source
ret, frame = cap.read()
frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)
# Apply background subtraction
fgmask2 = fgbg.apply(frame)
# eliminate shadows (gray color)
ret, imBin2 = cv2.threshold(fgmask2, 254, 255, cv2.THRESH_BINARY)
mask2 = cv2.morphologyEx(imBin2, cv2.MORPH_OPEN, kernelOp)
mask2 = cv2.morphologyEx(mask2, cv2.MORPH_CLOSE, kernelCl)
cv2.imshow('Original Video', frame) # display original video
cv2.imshow('Masked Video', mask2) # display B & W video
# press ESC to exit
k = cv2.waitKey(30) & 0xff
if k == 27:
break
# End of while(cap.isOpened())
# release video and close all windows
cap.release()
cv2.destroyAllWindows()
您拥有视频的初始帧,但您在while
循环中分配了相同的变量,因此它被覆盖。 也更好地工作灰度。
为初始帧分配一个不同的变量:
ret, initial_frame = cap.read()
initial_frame = cv2.resize(initial_frame, dim, interpolation=cv2.INTER_AREA)
initial_frame_gray = cv2.cvtColor(initial_frame, cv2.COLOR_BGR2GRAY)
在while
循环中,将视频逐帧读取为灰度,并从initial_frame_gray
中减去每一帧:
while cap.isOpened():
# Read an image of the video source
ret, frame = cap.read()
frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
由于您使用的是灰度,您可以使用cv2.subtract()
来查找当前帧和初始帧之间的差异。 它还确保像素强度保持在 [0-255] 范围内
difference = cv2.subtract(initial_frame_gray , frame_gray )
从这里开始,您可以执行后续操作(消除阴影、形态等)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.