๐Ÿ˜Ž ๊ณต๋ถ€ํ•˜๋Š” ์ง•์ง•์•ŒํŒŒ์นด๋Š” ์ฒ˜์Œ์ด์ง€?

[v0.32]์˜์ƒ์ฒ˜๋ฆฌ_๋ฐฐ๊ฒฝ ์ œ๊ฑฐ ๋ณธ๋ฌธ

๐Ÿ‘ฉ‍๐Ÿ’ป IoT (Embedded)/Image Processing

[v0.32]์˜์ƒ์ฒ˜๋ฆฌ_๋ฐฐ๊ฒฝ ์ œ๊ฑฐ

์ง•์ง•์•ŒํŒŒ์นด 2022. 1. 18. 00:13
728x90
๋ฐ˜์‘ํ˜•

220118 ์ž‘์„ฑ

<๋ณธ ๋ธ”๋กœ๊ทธ๋Š” ๊ท€ํ‰์ด ์„œ์žฌ๋‹˜์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๊ณต๋ถ€ํ•˜๋ฉฐ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค>

https://bkshin.tistory.com/entry/OpenCV-30-%EB%B0%B0%EA%B2%BD-%EC%A0%9C%EA%B1%B0Background-Subtraction?category=1148027 

 

OpenCV - 30. ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ(Background Subtraction)

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๊ฐ์ฒด ์ถ”์  ๋ฐฉ๋ฒ•์ธ ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ… ์—ญ์‹œ 'ํŒŒ์ด์ฌ์œผ๋กœ ๋งŒ๋“œ๋Š” OpenCV ํ”„๋กœ์ ํŠธ(์ด์„ธ์šฐ ์ €)'๋ฅผ ์ •๋ฆฌํ•œ ๊ฒƒ์ž„์„ ๋ฐํž™๋‹ˆ๋‹ค. ์ฝ”๋“œ: github.com/BaekKyunShin/Ope

bkshin.tistory.com

 

 

 

 

 

 

1. ๊ฐ์ฒด ์ถ”์ (Object Tracking)

: ๋™์˜์ƒ์—์„œ ์ง€์†์ ์œผ๋กœ ์›€์ง์ด๋Š” ๊ฐ์ฒด๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์„ ๊ฐ์ฒด ์ถ”์ 

 

 

2. ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ(Background Subtraction)

: ๊ฐ์ฒด ์ถ”์ ์„ ์œ„ํ•ด ๊ฐ์ฒด๊ฐ€ ๋ฌด์—‡์ธ์ง€, ์–ด๋”” ์žˆ๋Š”์ง€๋ถ€ํ„ฐ ๋ช…ํ™•ํžˆ ํŒŒ์•…

: ๊ฐ์ฒด๋ฅผ ๋ช…ํ™•ํžˆ ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ

: ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ๋Š” ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•˜๋Š” ์˜์ƒ์—์„œ ๊ฐ์ฒด๊ฐ€ ์—†๋Š” ๋ฐฐ๊ฒฝ ์˜์ƒ์„ ๋นผ๋Š” ๋ฐฉ๋ฒ•

: ์ฆ‰, ๋ฐฐ๊ฒฝ์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•ด ๊ฐ์ฒด๋งŒ ๋‚จ๊ธฐ๋Š” ๋ฐฉ๋ฒ•

์ถœ์ฒ˜:&nbsp;https://docs.opencv.org/3.4/d1/dc5/tutorial_background_subtraction.html

 

 

 

3. ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ ํ•จ์ˆ˜

cv2.bgsegm.createBackgroundSubtractorMOG(history, nmixtures, backgroundRatio, noiseSigma)

: ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฐ์ฒด ์ƒ์„ฑ 

: apply() ํ•จ์ˆ˜ ํ˜ธ์ถœ๋งŒ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Œ

 

- history=200 : ํžˆ์Šคํ† ๋ฆฌ ๊ธธ์ด
- nmixtures=5 : ๊ฐ€์šฐ์‹œ์•ˆ ๋ฏน์Šค์ฒ˜์˜ ๊ฐœ์ˆ˜
- backgroundRatio=0.7 : ๋ฐฐ๊ฒฝ ๋น„์œจ
- noiseSigma=0 : ๋…ธ์ด์ฆˆ ๊ฐ•๋„ (0=์ž๋™)

 

foregroundmask = backgroundsubtractor.apply(img, foregroundmask, learningRate)

: ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ ๊ฐ์ฒด์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ•จ์ˆ˜

 

- img : ์ž…๋ ฅ ์˜์ƒ
- foregroundmask : ์ „๊ฒฝ ๋งˆ์Šคํฌ
- learningRate=-1 : ๋ฐฐ๊ฒฝ ํ›ˆ๋ จ ์†๋„(0~1, -1: ์ž๋™)

 

backgroundImage = backgroundsubtractor.getBackgroundImage(backgroundImage)

: ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ ๊ฐ์ฒด์˜ ์ธํ„ฐํŽ˜์ด์Šค ํ•จ์ˆ˜

 

- backgroundImage : ํ›ˆ๋ จ์šฉ ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€

 

์›๋ณธ ๋™์˜์ƒ
๋ฐฐ๊ฒฝ ์ œ๊ฑฐ ๋™์˜์ƒ

 

 

 

 

+) ๋˜ ๋‹ค๋ฅธ ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ ๊ฐ์ฒด ์ƒ์„ฑ ํ•จ์ˆ˜

cv2.createBackgroundSubtractorMOG2(history, varThreshold, detectShadows)

: ์˜์ƒ์˜ ๊ฐ ํ”ฝ์…€์—์„œ ์ ์ ˆํ•œ ๊ฐ€์šฐ์‹œ์•ˆ ๋ถ„ํฌ ๊ฐ’์„ ์„ ํƒ

: ๋น›์˜ ๋ณ€ํ™”๊ฐ€ ์‹ฌํ•œ ์˜์ƒ์— ์ ์šฉํ•˜๊ธฐ ์ข‹์Œ

: ๊ทธ๋ฆผ์ž๋ฅผ ํƒ์ง€ํ• ์ง€ ๋ง์ง€ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Œ

: detectShadows=True๋กœ ์„ค์ •ํ•˜๋ฉด ๊ทธ๋ฆผ์ž๋ฅผ ํ‘œ์‹œํ•˜๊ณ  False๋กœ ์„ค์ •ํ•˜๋ฉด ๊ทธ๋ฆผ์ž๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์Œ

: ๊ทธ๋ฆผ์ž๋Š” ํšŒ์ƒ‰์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ , ๊ทธ๋ฆผ์ž๋ฅผ ํ‘œ์‹œํ•˜๋ฉด ์†๋„๊ฐ€ ๋‹ค์†Œ ๋Š๋ ค์ง

 

- history=500 : ํžˆ์Šคํ† ๋ฆฌ ๊ฐœ์ˆ˜
- varThreshold=16 : ๋ถ„์‚ฐ ์ž„๊ณ„ ๊ฐ’
- detectShadows=True : ๊ทธ๋ฆผ์ž ํ‘œ์‹œ

# BackgroundSubtractorMOG2 ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ
import numpy as np, cv2

cap = cv2.VideoCapture('img/walking.mp4')
fps = cap.get(cv2.CAP_PROP_FPS) # ํ”„๋ ˆ์ž„ ์ˆ˜ ๊ตฌํ•˜๊ธฐ
delay = int(1000/fps)

# ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ ๊ฐ์ฒด ์ƒ์„ฑ --- โ‘ 
fgbg = cv2.createBackgroundSubtractorMOG2()
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    # ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ ๋งˆ์Šคํฌ ๊ณ„์‚ฐ --- โ‘ก
    fgmask = fgbg.apply(frame)
    cv2.imshow('frame',frame)
    cv2.imshow('bgsub',fgmask)
    if cv2.waitKey(delay) & 0xff == 27:
        break
cap.release()
cv2.destroyAllWindows()

์›๋ณธ ๋™์˜์ƒ
createBackgroundSubtractorMOG2 ๋™์˜์ƒ

- ์˜ค,, ๊ทธ๋ฆผ์ž๊ฐ€ ๋” ๋งŽ์ด ๋ณด์ž„

- ๋ฐ”๋‹ฅ ํƒ€์ผ๋„ ๋ณด์ž„

 

 

 

 

์˜์ƒ ์ฒจ ๋‹ค๋ค„๋ดค๋Š”๋ฐ

์‹ ๊ธฐํ•˜๋‹น

728x90
๋ฐ˜์‘ํ˜•
Comments