๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์ด๋ฏธ์ง€ ๋ฐ ์˜์ƒ ์ฒ˜๋ฆฌ

OpenCV๋ฅผ ์ด์šฉํ•œ ์—ฐ๊ธฐ ๋ฐ ๋ถˆ๊ฝƒ ํƒ์ง€

by kaizen_bh 2024. 2. 17.

 

ํ•ด๋‹น ๋‚ด์šฉ์€ ์—…๋ฌด ์ค‘ ํ™”์žฌ ๋ฐœ์ƒ์‹œ ๋ถˆ๊ฝƒ๊ณผ ์—ฐ๊ธฐ๋ฅผ ํƒ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๋„ํ•ด๋ณธ ๊ธฐ๋ก๋“ค์„ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด๋‹ค. 

๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™”์žฌ๊ฐ€ ๋ฐœ์ƒํ•œ ์ด๋ฏธ์ง€๋ฅผ ํ™”์žฌ์ธ์ง€ ์•„๋‹Œ์ง€ ๋ถ„๋ฅ˜๋ฅผ ํ•˜๊ฑฐ๋‚˜ ๊ฐ์ฒด ํƒ์ง€๋ฅผ ์ด์šฉํ•ด ํ™”์žฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๋ถ€์œ„๋ฅผ ํƒ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ๋“ค์ด ์กด์žฌํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ ์ž ํ•˜๋Š” ํ˜„์žฅ์˜ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•œ ํ™”์žฌ ๋ฐ์ดํ„ฐ๋Š” ๊ตฌํ•  ์ˆ˜๊ฐ€ ์—†์œผ๋ฉฐ ์›น์ƒ์— ๊ณต๊ฐœ๋˜์–ด ์žˆ๋Š” ์˜คํ”ˆ ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค๋Š” ์ , ๋”ฅ๋Ÿฌ๋‹ ๋ชจ๋ธ์— ํ™”์žฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•™์Šต ์‹œ ์ƒ‰์ƒ์„ ๊ธฐ์ค€์œผ๋กœ ํ•™์Šตํ•˜๊ธฐ์— ๋ถˆ๊ฝƒ๊ณผ ์—ฐ๊ธฐ์™€ ๋น„์Šทํ•œ ์ƒ‰์ƒ์˜ ๋ฌผ์ฒด๋“ค์„ ํ™”์žฌ๋กœ ์˜คํƒ์ง€ํ•œ๋‹ค๋Š” ์  ๋“ฑ ์—ฌ๋Ÿฌ ํ•œ๊ณ„์ ์ด ์กด์žฌํ•˜์˜€๋‹ค.

๋‹จ์ˆœํžˆ ๋ชจ๋ธ์˜ ์„ฑ๋Šฅ๋งŒ์œผ๋กœ๋Š” ํ•œ๊ณ„๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ๋А๊ปด ๋ชจ๋ธ ์™ธ์— ์ „-ํ›„ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์—ฌ๋Ÿฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹œ๋„ํ•ด๋ณธ ๊ธฐ๋ก๋“ค์ด๋‹ค.

 


 

 

1. ๋ถˆ๊ฝƒ๊ณผ ์—ฐ๊ธฐ์˜ ํŠน์„ฑ

 

๋ถˆ๊ฝƒ๊ณผ ์—ฐ๊ธฐ๋Š” ๊ฐ๊ฐ ๋‹ค๋ฅธ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ ์ž˜ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํ•„์š”ํ•˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ถˆ๊ฝƒ์€ ๊ทœ์น™์ ์ธ ๋ชจ์–‘๊ณผ ๋†’์€ ์˜จ๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์—ฐ๊ธฐ๋Š” ๋ถˆ๊ทœ์น™ํ•œ ๋ชจ์–‘๊ณผ ๋‚ฎ์€ ์˜จ๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

๋ถˆ๊ฝƒ์˜ ๋ฐ๊ธฐ, ํฌ๊ธฐ, ๋ชจ์–‘ ๋“ฑ๊ณผ ์—ฐ๊ธฐ์˜ ๋†๋„, ๋ถ„ํฌ, ์›€์ง์ž„ ๋“ฑ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ดํ™”์ƒ ์นด๋ฉ”๋ผ๋ฅผ ์ด์šฉํ•ด ์˜จ๋„๋ณ„๋กœ ์ƒ‰์ƒ์ด ๋ถ„ํฌ๋˜์–ด ์žˆ๋Š” ์˜์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉด ๋” ์ •ํ™•ํ•œ ํŒ๋…์ด ๊ฐ€๋Šฅํ•˜๊ฒ ์ง€๋งŒ ์‹ค์ œ ํ˜„์žฅ์—๋Š” ์—ดํ™”์ƒ์ด ์—†๋Š” ๋‹จ์ˆœ CCTV์ธ ๊ณณ๋“ค์ด ๋Œ€๋‹ค์ˆ˜์ด๋ฉฐ ์—ดํ™”์ƒ ์นด๋ฉ”๋ผ๋ฅผ ์„ค์น˜ํ•œ๋‹ค๋Š” ๋น„์šฉ์  ๋ถ€๋‹ด๋„ ํฌ๊ธฐ์— ๋‹จ์ˆœ ์˜์ƒ๋งŒ์„ ๊ณ ๋ คํ•œ๋‹ค.

 

1. ์ƒ‰์ƒ.

๋ถˆ๊ฝƒ์˜ ์ƒ‰์€ ๊ฐ€์—ฐ๋ฌผ์งˆ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์ƒ‰์„ ๋ ๋ฉฐ ์˜จ๋„์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ ๋˜ํ•œ ๋‹ค๋ฅด๋‹ค.

์–ผํ• ๋ณด๊ธฐ์—” ๋ถˆ์ด ๋นจ๊ฐ„์ƒ‰, ์ฃผํ™ฉ์ƒ‰ ๋“ฑ์œผ๋กœ ๋ณด์ด์ง€๋งŒ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ๋ถˆ๊ฝƒ์€ ๋ชจ๋“  ์ƒ‰์ด ๋™์ผํ•˜์ง€ ์•Š์œผ๋ฉฐ ์œ„์น˜, ๋ถ€์œ„์— ๋”ฐ๋ผ ์˜จ๋„์™€ ์ƒ‰, ๋ฐ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๋‹ค.

 

2. ์›€์ง์ž„.

๋ถˆ๊ฝƒ์€ ๋ฐ”๋žŒ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•„ ํ˜•ํƒœ๊ฐ€ ์ผ์ •ํ•˜์ง€ ์•Š๊ณ  ์ฃผ๋ณ€๋ฌผ์งˆ์„ ๊ฐ€์—ฐ๋ฌผ๋กœ ์‚ผ์•„ ์ด๋™ํ•˜๊ธฐ๋„ ํ•˜๋Š” ๋™์  ํŠน์„ฑ์„ ์ง€๋‹Œ๋‹ค. CCTV ์˜์ƒ์˜ ํŠน์„ฑ์ƒ ์œ„์น˜๋งˆ๋‹ค ์ฐจ์ด๊ฐ€ ์กด์žฌํ•˜๊ฒ ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ๋ฐฐ๊ฒฝ์ด ๊ณ ์ •๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๊ณ  ์ƒ‰์ƒ๊ณผ ์›€์ง์ž„ ๋‘ ๊ฐ€์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•„ํ„ฐ๋ง ํ•œ๋‹ค๋ฉด ์ข€๋” ์ •ํ™•ํ•œ ํŒ๋‹จ์„ ํ•  ๊ฒƒ์ด๋‹ค.

๋ถˆ๊ฝƒ์€ ์—ฐ์†Œ ๊ณผ์ •์—์„œ ์—ด์ƒ์„ฑ์— ๋”ฐ๋ผ ์—ด๊ธฐ์šด์ด ์ƒ์Šนํ•˜์—ฌ ๋ถˆ๊ฝƒ์ด ์ƒ์Šนํ•  ๋•Œ ์ฃผ๋ณ€ ๊ณต๊ธฐ์™€ ์ƒํ˜ธ์ž‘์šฉ์œผ๋กœ ๋ถˆ๊ทœ์น™์ ์ธ ์›€์ง์ž„์„ ๋ณด์ธ๋‹ค. ๋˜๋Š” ์—ฐ์†Œ๊ณผ์ •์—์„œ ํ™”ํ•™๋ฐ˜์‘ ์‹œ ๋ฐฉ์ถœ๋˜๋Š” ํ™”ํ•™์  ์—๋„ˆ์ง€์˜ ์–‘๊ณผ ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ์„œ๋„ ๋ถˆ๊ทœ์น™์ ์ธ ํ˜•ํƒœ์™€ ์›€์ง์ž„์„ ๋ณด์ด๋ฉฐ ์™ธ๋ถ€ ๊ณต๊ธฐ์˜ ํ๋ฆ„์ด๋‚˜ ํ’์†, ์˜จ๋„์— ๋”ฐ๋ผ์„œ๋„ ์›€์ง์ž„์— ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค.

 

 


 

 

2. ํŠน์„ฑ์— ๋”ฐ๋ฅธ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๊ธฐ๋ฒ•

 

2-1. ์˜์ƒ ์ฐจ๋ถ„

๋ฐฐ๊ฒฝ ์ฐจ๋ถ„, ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ๋Š” ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•œ ์˜์ƒ์—์„œ ๊ฐ์ฒด๊ฐ€ ์—†๋Š” ๋ฐฐ๊ฒฝ ์˜์ƒ์„ ๋นผ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ฐฐ๊ฒฝ์„ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜์—ฌ ๊ฐ์ฒด๋งŒ ๋‚จ๊ธฐ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

์ •์ ์ธ(๊ณ ์ •๋œ) ์นด๋ฉ”๋ผ๋กœ ์ผ์ • ์žฅ์†Œ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๊ฐ์ฒด๋“ค๋งŒ ์ถ”์ถœํ•ด์•ผํ•  ๋•Œ, ์ •์ ์ธ ๋ฐฐ๊ฒฝ(background)์œผ๋กœ๋ถ€ํ„ฐ ์›€์ง์ด๋Š” ์ „๊ฒฝ(foreground)์„ ์ถ”์ถœํ•˜๊ณ ์ž ํ•  ๋•Œ OpenCV์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. OpenCV๋Š” ๋‹ค์–‘ํ•œ ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ œ๊ณตํ•œ๋‹ค. (cv::cuda, OpenCV์—์„œ GPU ์‚ฌ์šฉ์„ ์ง€์›ํ•จ)

 

๋ฐฐ๊ฒฝ์ฐจ๋ถ„ ์ข…๋ฅ˜

  1. ์ •์  ๋ฐฐ๊ฒฝ์ฐจ๋ถ„(์ฐจ์˜์ƒ)
    ํ”„๋ ˆ์ž„๊ณผ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„๊ฐ„์˜ ํ”ฝ์…€๊ฐ’๋ณ„๋กœ ์ฐจ์ด๊ฐ’์„ ๊ตฌํ•˜๊ณ  ์ผ์ •๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ด์ง„ํ™”๋ฅผ ํ•˜์—ฌ ์›€์ง์ด๋Š” ๊ฐ์ฒด๋ฅผ ๊ฒ€์ถœํ•œ๋‹ค. ๊ณ ์ •๋œ ๋ฐฐ๊ฒฝ์— ์›€์ง์ด๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ํƒ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ( cv2.absdiff ํ•จ์ˆ˜ ์ด์šฉ) => ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฐ๊ฒฝ์ด ๊ณ ์ •๋˜์–ด ์žˆ๋‹ค.

  2. ์ด๋™ ํ‰๊ท  ๋ฐฐ๊ฒฝ์ฐจ๋ถ„
    ์œ„์˜ ์ •์  ๋ฐฐ๊ฒฝ์ฐจ๋ถ„์˜ ๊ฒฝ์šฐ ์ƒˆ๋กœ ๋‚˜ํƒ€๋‚œ ๊ฐ์ฒด๊ฐ€ ๊ณ ์ •๋˜์—ˆ์„ ๋•Œ ์ด๊ฒƒ์„ ์ง€์†์ ์œผ๋กœ ๊ฐ์ฒด๋กœ ์ธ์‹ํ•œ๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค. CCTV์˜์ƒ์œผ๋กœ ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด ๋ฌผ๊ฑด์ •๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ฌผ์ฒด์˜ ์ด๋™์ด ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ ์ด ์ด๋™ํ•œ ๋ฌผ์ฒด๋ฅผ ๊ณ„์† ์ธ์‹ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋™ ํ‰๊ท  ๋ฐฐ๊ฒฝ์ฐจ๋ถ„์€ ์ด๋Ÿฌํ•œ ์ด๋™์ด ์žˆ์„ ๊ฒฝ์šฐ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๋ฐฐ๊ฒฝ์œผ๋กœ ํฌํ•จ, ๋ฐฐ๊ฒฝ์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ฐฐ๊ฒฝ ์ฐจ๋ถ„์„ ํ•œ๋‹ค.

  3. MOG ๋ฐฐ๊ฒฝ ๋ชจ๋ธ ๋ฐฐ๊ฒฝ ์ฐจ๋ถ„ (Background SubtractorMOG, MOG2)
    Mixture of Gaussian, GMM(Gaussian Mixture Model)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ ๊ฐ ํ”ฝ์…€์— ๋Œ€ํ•ด MOG ํ™•๋ฅ  ๋ชจ๋ธ์„ ์„ค์ •ํ•˜์—ฌ ๋ฐฐ๊ฒฝ๊ณผ ์ „๊ฒฝ์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋™ ํ‰๊ท ์„ ์ด์šฉํ•ด์„œ ๋ฐฐ๊ฒฝ์„ ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์œ„์˜ ํ‰๊ท  ๋ฐฐ๊ฒฝ์ฐจ๋ถ„๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.

  4. GMG ํ†ต๊ณ„์  ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€ ์ œ๊ฑฐ์™€ ํ”ฝ์…€ ๋‹จ์œ„์˜ ๋ฒ ์ด์ง€์•ˆ ๋ถ„ํ• ์„ ๊ฒฐํ•ฉํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค.

 

2-2. ์ปฌ๋Ÿฌ๋งต ๋ถ„์„

์ปฌ๋Ÿฌ๋งต์˜ ์ข…๋ฅ˜์—๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ๊ทธ ์ค‘ 5๊ฐ€์ง€๋ฅผ ๊ฐ„๋‹จํžˆ ์†Œ๊ฐœํ•œ๋‹ค.

 

  1. RGB : ์ ์ƒ‰(R), ๋…น์ƒ‰(G), ์ฒญ์ƒ‰(B) 3๊ฐ€์ง€์˜ ์ƒ‰ ์ •๋ณด๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ์ƒ‰์ƒ์„ ํ‘œํ˜„ํ•˜๋Š” ์ปฌ๋Ÿฌ๋งต. ๋ถˆ๊ฝƒ์˜ ์ƒ‰ ์ค‘ ๋นจ๊ฐ„์ƒ‰, ์ฃผํ™ฉ์ƒ‰ ๊ณ„์—ด์ด ๋šœ๋ ทํ•  ๊ฒฝ์šฐ RGB๋ฅผ ํ†ตํ•ด ๊ตฌ๋ถ„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  2. YCbCr : ๋ฐ๊ธฐ์™€ ์ƒ‰์กฐ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์ƒ‰์ƒ ๊ฐ์ง€๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ์ƒ‰์ƒ ์ •๋ณด๋ฅผ ์ค„์ด๊ณ  ๋ฐ๊ธฐ์ •๋ณด๋ฅผ ๊ฐ•์กฐ ์‹œํ‚จ ์ปฌ๋Ÿฌ๋งต. ํœ˜๋„(Y)์™€ ์ƒ‰์ฐจ์„ฑ๋ถ„[์ฒญ์ƒ‰์ฐจ(Cb), ์ ์ƒ‰์ฐจ(Cr)] ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์ƒ‰์ƒ์„ ํ‘œํ˜„. Cb๋Š” ํŒŒ๋ž€์ƒ‰์—์„œ ๋ฐ๊ธฐ๋ฅผ ๋บ€ ๊ฐ’์ด๊ณ  Cr ์€ ๋นจ๊ฐ„์ƒ‰์—์„œ ๋ฐ๊ธฐ๋ฅผ ๋บ€ ๊ฐ’์ด๋‹ค. ์ƒ‰์ฐจ ์„ฑ๋ถ„์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ€์ง‘๋œ ์ •๋ณด๋ฅผ ํš๋“ํ•˜๊ธฐ์— ์šฉ์ดํ•˜๋‹ค.

  3. HSV : ๋ช…๋„ ์ •๋ณด๋ฅผ ๋ณด๋‹ค ๊ฐ•์กฐํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์ปฌ๋Ÿฌ๋งต. ์ƒ‰(Hue), ์ฑ„๋„(Saturation), ๋ช…๋„(Value) ์ •๋ณด๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์กฐ์ ˆํ•˜์—ฌ ์ƒ‰์ƒ์„ ํ‘œํ˜„. ์ฑ„๋„์™€ ๋ช…๋„๋ฅผ ์‚ฌ์šฉํ•ด ๊ทธ๋ฆผ์ž๋‚˜ ๋ฐ๊ธฐ์— ๋Œ€์‘ํ•˜๊ธฐ ์šฉ์ดํ•จ. ์ƒ‰์ƒ H๋Š” ํŒŒ์žฅ์ด ๊ฐ€์žฅ ๊ธด ๋นจ๊ฐ„์ƒ‰์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋Š” ์ƒ‰์ƒ์˜ ๋ถ„ํฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ์ฑ„๋„์ธ S๋Š” ์ˆœ์ˆ˜ํ•œ ์ƒ‰์ƒ์— ํ•˜์–€ ๋น›์ด ํฌํ•จ๋œ ์ •๋„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋ช…๋„์ธ V๋Š” ๋น›์˜ ๊ฐ•๋„๋ฅผ ์ธก์ •ํ•˜๋Š” ์ •๋„๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ํ•˜๋‚˜์˜ ์„ฑ๋ถ„์œผ๋กœ ๋…๋ฆฝ๋˜์–ด ๋ฒ”์œ„๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์กฐ๋ช… ๋ณ€ํ™”์— ๊ฐ•์ธํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

  4. LAB : CIE LAB, ๋ฐ๊ธฐ(L), ๋…น์ƒ‰/์ ์ƒ‰(+-a) ๊ฐ•๋„, ์ฒญ์ƒ‰/ํ™ฉ์ƒ‰(+-b) ๊ฐ•๋„ ์„ธ ๊ฐ€์ง€ ์ฑ„๋„๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.๋ถˆ๊ฝƒ์€ ์ฃผ๋กœ ๋นจ๊ฐ•/์ฃผํ™ฉ์ƒ‰์„ ๋„๋ฏ€๋กœ a*์ฑ„๋„์—์„œ ํŠน์ • ๋ฒ”์œ„์˜ ๊ฐ’์„ ์ž„๊ณ„์น˜๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ถˆ๊ฝƒ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

  5. ์ƒ‰์ƒ ๋ถ„๋ฆฌ : RGB ์ปฌ๋Ÿฌ ๋งต์—์„œ R ์ฑ„๋„๊ฐ’๊ณผ B,G ์ฑ„๋„ ๊ฐ’์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์ƒ‰์ƒ ๋ถ„๋ฆฌ ์ปฌ๋Ÿฌ๋งต์„ ํ˜•์„ฑํ•œ๋‹ค. ๋ถˆ๊ฝƒ์˜ ์ฃผ ์ƒ‰์ƒ์ด ๋นจ๊ฐ„์ƒ‰, ์ฃผํ™ฉ์ƒ‰์ด๋ฏ€๋กœ R ์ฑ„๋„๊ฐ’์ด ๋Œ€์ฒด๋กœ ๋†’์œผ๋ฉฐ ๋‹ค๋ฅธ B,G ์ฑ„๋„์ด ๋‚ฎ๊ธฐ์— ์ผ์ •ํ•œ ๋ฒ”์œ„๋‚ด์˜ ์ฐจ์ด๊ฐ’์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์„ ์ด์šฉํ•œ๋‹ค.

 

 


3. ์ปฌ๋Ÿฌ๋งต ๋ถ„์„๊ณผ ์˜์ƒ ์ฐจ๋ถ„ ์‚ฌ์šฉ

3-1. ์ปฌ๋Ÿฌ๋งต ๋ถ„์„

๋ถˆ์˜ ์ •์  ํŠน์„ฑ, ์ƒ‰์ƒ์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ, ์ฐธ๊ณ ํ•œ ๋…ผ๋ฌธ๋“ค์—์„œ ์ œ์‹œํ•œ ์ปฌ๋Ÿฌ๋งต ์ฑ„๋„์˜ ์ž„๊ณ„์น˜๋“ค์„ ์ ์šฉ ๋ฐ ์‹œ๊ฐํ™”ํ•ด๋ณด์•˜๋‹ค.

์ƒ‰์ƒ์„ ํ†ตํ•ด ๋ถˆ๊ฝƒ์„ ๊ฒ€์ถœํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋ถˆ๊ณผ ๋น„์Šทํ•œ ์ƒ‰์ƒ์˜ ๊ฐ์ฒด๋“ค๊ณผ ๊ตฌ๋ถ„์„ ํ•˜๋Š”์ง€ ํ™•์ธ๋ฅผ ํ™•์ธํ•ด๋ณด์•˜๊ณ  ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ปฌ๋Ÿฌ๋งต๋“ค์˜ ์กฐํ•ฉ์„ ์‹คํ—˜ํ•ด๋ณด์•˜๋‹ค.

+ ์ฐธ๊ณ ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋“ค์—์„  ๋ถˆ๊ณผ ๋น„์Šทํ•œ ์ƒ‰์ƒ์˜ ๊ฐ์ฒด์˜ ๊ตฌ๋ถ„๊นŒ์ง€ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜๋‹ค.  

 

def find_fire(frame):
    img = cv2.imread(frame)
    # img = frame # ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ”„๋ ˆ์ž„ ๋ฐ›์•„์˜ด

    rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    img_YCrCb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)

    # ๊ฐ ์ปฌ๋Ÿฌ๋งต๋ณ„ ๋ ˆํผ๋Ÿฐ์Šค๋“ค์—์„œ ์‚ฌ์šฉํ•œ ์ฑ„๋„๋ณ„ ํ”ฝ์…€ ๋ฒ”์œ„
    lower_rgb = np.array([200,100,20])
    upper_rgb = np.array([255,220,150])

    lower_ycrcb = np.array([50,130,0])
    upper_ycrcb = np.array([255,255,130])

    lower_hsv = np.array([20,50,50])
    upper_hsv = np.array([40,255,255])

    mask_rgb = cv2.inRange(rgb, lower_rgb, upper_rgb)
    mask_ycrcb = cv2.inRange(img_YCrCb, lower_ycrcb, upper_ycrcb)
    mask_hsv = cv2.inRange(hsv_img, lower_hsv, upper_hsv)

    # ์ปฌ๋Ÿฌ๋งต ์กฐํ•ฉ ํ…Œ์ŠคํŠธ ๋ฐ ํ™•์ธ
    # mask = cv2.bitwise_and(mask_rgb, mask_ycrcb, mask_hsv)
    # mask = cv2.bitwise_or(mask_rgb, mask_hsv)
    # mask = cv2.bitwise_or(mask_hsv, mask_ycrcb)
    mask = cv2.bitwise_and(mask_rgb, mask_ycrcb)
    result = cv2.bitwise_and(rgb, img, mask=mask)

    return result

 

 

๋ถˆ์˜ ํ˜•ํƒœ๋ฅผ ์žก์ง€๋งŒ ๋น„์Šทํ•œ ์ƒ‰์ƒ์˜ ๊ฐ์ฒด๋„ ์žก๋Š”๋‹ค. ํ˜„์žฌ๋กœ์„œ๋Š” ๋ถˆ๊ฝƒ๊ณผ ์ƒ‰์ด ๋น„์Šทํ•œ ์ ์ƒ‰ ๊ณ„์—ด์˜ ๊ฐ์ฒด๋“ค๊ณผ ๊ตฌ๋ถ„์ด ํž˜๋“ค๋‹ค.

๊ฐ ์ฑ„๋„๋ณ„ ์ ์ ˆํ•œ ์ž„๊ณ„์น˜๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋ฉฐ ์ ์ ˆํ•œ ๊ฐ’์„ ์ฐพ๋”๋ผ๋„ ์ปฌ๋Ÿฌ๋งต ๋ถ„์„๋งŒ์œผ๋กœ๋Š” ๋ถˆ๊ฝƒ๊ณผ ๋น„์Šทํ•œ ์ƒ‰์ƒ์˜ ๋ฌผ์ฒด๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ์—๋Š” ํž˜๋“ค ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‚˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋” ํ•„์š”ํ•ด๋ณด์ธ๋‹ค.

 

 

3-2. ์˜์ƒ ์ฐจ๋ถ„

  • ์˜์ƒ ์ฐจ๋ถ„, Background Subtraction์—๋Š” OpenCV์˜ MOG, MOG2, GMG๋‚˜ ํ”„๋ ˆ์ž„๋ผ๋ฆฌ ์ง์ ‘ ํ”ฝ์…€๊ฐ’์„ ๋นผ์„œ ๋น„๊ตํ•˜๋Š” ์ฐจ์˜์ƒ์ด๋‚˜ ์ด๋™ ํ‰๊ท  ๋ฐฐ๊ฒฝ ๋“ฑ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•๋“ค์ด ์กด์žฌํ•œ๋‹ค.
  • ๋งŒ์•ฝ ํ•œ ์‹œ์ , ํ”„๋ ˆ์ž„์„ ๊ณ ์ •ํ•˜์—ฌ ๊ธฐ์ค€์œผ๋กœ ๋‘๊ณ  ์›€์ง์ด๋Š” ๊ฐ์ฒด๋ฅผ ์žก๋Š”๋‹ค๋ฉด ์›€์ง์ž„์ด ์กฐ๊ธˆ์ด๋ผ๋„ ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋Œ€์ƒ์ด ์žกํžˆ๋ฏ€๋กœ ๋ฐฐ๊ฒฝ์œผ๋กœ ์‚ผ๋Š” ํ”„๋ ˆ์ž„์ด ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋˜์•ผํ•œ๋‹ค.
    ex) ์—ฐ๊ธฐ ๋ฐœ์ƒ ์ดˆ๋ฐ˜์—๋Š” ํ™•์‚ฐ ์ „์ด๋ฏ€๋กœ ์ฃผ๋ณ€๊ณผ ์–ด๋А์ •๋„ ๊ตฌ๋ถ„๊ฐ์„ ๊ฐ€์ง€๋ฉฐ ํ”ฝ์…€ ๋น„๊ต๋ฅผ ํ†ตํ•ด ์›€์ง์ž„์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐ๊ฒฝ์ด ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜๋ฉด์„œ ํ™•์‚ฐ๋œ ์—ฐ๊ธฐ๋“ค์ด ๋ฐฐ๊ฒฝ์— ๋™ํ™”๋จ์— ๋”ฐ๋ผ ๋ฐฐ๊ฒฝ๊ณผ ์—ฐ๊ธฐ์˜ ํ”ฝ์…€๊ฐ’, ์ƒ‰์ƒ์ด ๋น„์Šทํ•ด์ ธ ์›€์ง์ž„์„ ๋†“์น  ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค. 
  • ํ•˜์ง€๋งŒ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋„ˆ๋ฌด ๋น ๋ฅด๋ฉด ์ „์— ์›€์ง์ž„์„ ๋ณด์˜€๋˜ ๊ฐ์ฒด๋“ค์ด ๋ฐฐ๊ฒฝ์— ๋™ํ™”๋˜์–ด ์‚ฌ๋ผ์งˆ์ˆ˜๋„ ์žˆ๋‹ค. ํ˜น์€ ๋ฐฐ๊ฒฝ ์—…๋ฐ์ดํŠธ์˜ ํ”„๋ ˆ์ž„ ๊ฐ„๊ฒฉ์„ ์กฐ์ •ํ•ด๋ณด๋ฉด์„œ ์ฐพ๋Š” ๊ณผ์ •๋„ ํ•„์š”ํ•˜๋‹ค

< ์˜์ƒ ์ฐจ๋ถ„์„ ์ด์šฉํ•œ ์—ฐ๊ธฐ ์›€์ง์ž„ ๊ฐ์ง€ >

 

  • ํ•ด๋‹น ์ด๋ฏธ์ง€๋Š” ์˜์ƒ ์† ์›€์ง์ž„์ด ์žˆ๋Š” ๋ถ€๋ถ„์„ ํƒ์ง€ํ•˜์—ฌ ์ผ์ • ๋†’์ด์˜ ๋ผ์ธ์— ๊ฑธ์ณ์žˆ์„ ๊ฒฝ์šฐ ํƒ์ง€ํ•œ ๋Œ€์ƒ์„ ์‹œ๊ฐํ™”ํ•œ ๊ฒƒ์ด๋‹ค. ํ™”์žฌ ๋ฐœ์ƒ์‹œ ์—ฐ๊ธฐ๊ฐ€ ์ƒ์Šนํ•œ๋‹ค๋Š” ํŠน์„ฑ์„ ์ด์šฉํ•˜์˜€๋‹ค. 
  • ๊ณ ์ •๋œ ์นด๋ฉ”๋ผ๊ฐ€ ์•„๋‹Œ๊ฒฝ์šฐ ํ”๋“ค๋ฆผ์— ์˜ํ•ด ๋…ธ์ด์ฆˆ๊ฐ€ ์‹ฌํ•˜๊ฒŒ ๋ฐœ์ƒ - ์™ธ๋ถ€ ์นด๋ฉ”๋ผ์˜ ๊ฒฝ์šฐ ๋ˆˆ์ด๋‚˜ ๋น„, ๋ฐ”๋žŒ ๋“ฑ ํ™˜๊ฒฝ์ ์ธ ์š”์†Œ๋“ค์ด ๋ณ€์ˆ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค. 
  • ๋˜ํ•œ ํ•ด๋‹น ์ด๋ฏธ์ง€๋‚˜ ์‹คํ–‰ ์˜์ƒ์€ ๋‹จ์ˆœํžˆ ์˜์ƒ์— ๋ฐฐ๊ฒฝ ์ œ๊ฑฐ๋ฅผ ์ ์šฉํ•ด์„œ ๊ฐ์ฒด์˜ ์›€์ง์ž„์„ ์žก์„ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ ๋ฐ ์‹œ๊ฐํ™”์— ๋ถˆ๊ณผํ•˜๋‹ค. ์ฃผ์ฐจ์žฅ CCTV ๊ธฐ์ค€, ์˜์ƒ ์ฐจ๋ถ„ ์ ์šฉ์‹œ ์—ฐ๊ธฐ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์‚ฌ๋žŒ๊ณผ ์ฐจ ๋“ฑ ๋‹ค๋ฅธ ์›€์ง์ด๋Š” ๊ฐ์ฒด์™€ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์ค€์ด ํ•„์š”ํ•˜๋‹ค. ๋ฏธ์„ธํ•œ ์›€์ง์ž„์„ ์žก๋Š” ๊ฒƒ๋„ ์ค‘์š”ํ•˜์ง€๋งŒ ๊ทธ ์›€์ง์ž„์ด ์—ฐ๊ธฐ์ธ์ง€ ์•„๋‹Œ์ง€ ํŒ๋ณ„๋„ ์ค‘์š”ํ•˜๋‹ค.

 


 

์˜์ƒ ์† ํ™”์žฌ๋ฅผ ํƒ์ง€ํ•˜๋Š” ๋ชจ๋ธ์„ ๋งŒ๋“ ๋‹ค๋Š” ๊ฑด ์ •๋ง ์–ด๋ ค์šด ์ผ์ด๋‹ค. ๋ชจ๋ธ๋งŒ์œผ๋กœ ํƒ์ง€๋ฅผ ํ•˜๋ ค๋ฉด ์—ฐ๊ธฐ๋‚˜ ๋ถˆ๊ฝƒ๊ณผ ์•„๋ฌด๋ฆฌ ๋น„์Šทํ•œ ์ƒ‰์ƒ์˜ ๋ฌผ์ฒด๋“ค์ด ์žˆ๋”๋ผ๋„ ๊ตฌ๋ถ„์„ ํ•  ์ˆ˜ ์žˆ์„ ์ •๋„์˜ ๋†’์€ ์„ฑ๋Šฅ์˜ ๋ชจ๋ธ์„ ๋ฝ‘์•„์•ผํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„๋„ ์‰ฝ์ง€ ์•Š๊ณ  ๋” ์ž˜ ํ•™์Šต์‹œํ‚ค๊ธฐ ์œ„ํ•ด ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ํŠœ๋‹์ด๋‚˜ ์ง€์†์ ์œผ๋กœ ํ•™์Šต์„ ์‹œ์ผœ์„œ ๋” ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ฝ‘๋Š”๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„์ด๋‚˜ ๋ฆฌ์†Œ์Šค๋„ ์ ์ง€ ์•Š๋‹ค๋Š” ์  ๋“ฑ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ฑŒ๋ฆฐ์ง€๋“ค์ด ์กด์žฌํ•œ๋‹ค. 

์ฐจ๋ถ„ ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ์˜ ๊ฒฐํ•ฉ์„ ํ†ตํ•ด ์—ฐ๊ธฐ ํƒ์ง€์˜ ์„ฑ๋Šฅ์„ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค. ์–ด์ฉŒ๋ฉด ViT์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด๋ณด๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ณ  ๋‚ด๊ฐ€ ์•Œ์ง€ ๋ชปํ•œ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๋ก ๋“ค์ด ์กด์žฌํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ ๋ถ€๋ถ„๋“ค์„ ์ฑ„์›Œ๋ณด๋ฉด์„œ ๋” ์ง„ํ–‰ํ•ด๋ด์•ผ๊ฒ ๋‹ค.