簡體   English   中英

如何將背景減法設置為穩定對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM