
화재는 짧은 시간 안에 큰 피해를 일으키는 재난 중 하나입니다.
전통적인 화재 감지 시스템은 센서 기반으로 작동하지만, 최근에는 컴퓨터 비전(Computer Vision) 기술을 활용한 영상 기반 화재 및 연기 감지 시스템이 각광받고 있습니다.
이번 글에서는 Python과 OpenCV, 딥러닝 모델을 활용해 이미지나 영상에서 **화재(Fire) 및 연기(Smoke)**를 탐지하는 방법을 단계별로 살펴보겠습니다.
영상 기반 화재 감지의 필요성과 원리
센서형 화재 감지기는 온도나 연기 입자를 감지하지만, 반응 속도가 늦거나 특정 환경에서는 오류가 발생할 수 있습니다.
이에 비해 영상 기반 감지는 카메라 영상 속 색상, 움직임, 텍스처 변화를 분석하여 빠른 화재 탐지가 가능합니다.
화재 감지의 주요 원리는 다음과 같습니다.
- 색상(Color) 기반 분석
- 불꽃의 특유한 색상(빨강, 주황, 노랑 영역)을 탐지
- RGB 또는 HSV 색상 공간에서 특정 범위를 필터링
- 움직임(Motion) 기반 탐지
- 영상 프레임 간의 변화량을 계산하여 불꽃의 깜박임이나 연기 확산을 감지
- 형태(Shape) 및 질감(Texture) 분석
- 화염의 불규칙한 경계선, 연기의 흐릿한 패턴 등을 특징으로 활용
Python과 OpenCV를 이용한 화염 영역 탐지
OpenCV는 화염의 색상 정보를 분석하는 데 매우 효과적입니다.
HSV(Hue, Saturation, Value) 색상 공간을 사용하면 조명 변화에 덜 민감하게 화염 영역을 구분할 수 있습니다.
import cv2
import numpy as np
# 1. 영상 불러오기
cap = cv2.VideoCapture('fire_video.mp4')
while True:
ret, frame = cap.read()
if not ret:
break
# 2. 색상 공간 변환
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 3. 불꽃 색상 범위 정의 (주황~노랑)
lower_fire = np.array([18, 50, 50])
upper_fire = np.array([35, 255, 255])
# 4. 색상 마스크 적용
mask = cv2.inRange(hsv, lower_fire, upper_fire)
# 5. 결과 시각화
result = cv2.bitwise_and(frame, frame, mask=mask)
cv2.imshow('Fire Detection', result)
if cv2.waitKey(1) & 0xFF == 27:
break
cap.release()
cv2.destroyAllWindows()
이 코드는 불꽃의 색상 범위를 기반으로 화재 영역을 추출합니다.
실제 환경에서는 밝기나 조명 조건이 다양하므로 HSV 범위를 상황에 맞게 조정해야 합니다.
연기(Smoke) 탐지를 위한 접근 방법
연기는 화염보다 더 탐지하기 어려운 요소입니다.
연기의 색상은 명확하지 않고, 회색에서 흰색까지 다양하며 주변 조명에 따라 쉽게 혼동될 수 있습니다.
따라서 단순 색상 분석보다 움직임 기반 분석(Motion Detection) 과 텍스처 기반 분석(Texture Analysis) 이 병행되어야 합니다.
# 프레임 간 차이를 이용한 연기 탐지 예시
prev_frame = None
cap = cv2.VideoCapture('smoke_video.mp4')
while True:
ret, frame = cap.read()
if not ret:
break
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (21, 21), 0)
if prev_frame is None:
prev_frame = gray
continue
# 프레임 차이 계산
frame_delta = cv2.absdiff(prev_frame, gray)
thresh = cv2.threshold(frame_delta, 30, 255, cv2.THRESH_BINARY)[1]
# 변화가 큰 영역 감지
cnts, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in cnts:
if cv2.contourArea(c) < 500:
continue
(x, y, w, h) = cv2.boundingRect(c)
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
cv2.imshow('Smoke Detection', frame)
prev_frame = gray
if cv2.waitKey(30) & 0xFF == 27:
break
cap.release()
cv2.destroyAllWindows()
위 코드는 프레임 간의 밝기 변화로 움직이는 연기 영역을 탐지하는 간단한 예시입니다.
연기의 움직임이 지속적으로 발생하는 영역을 분석하여 경고를 발생시킬 수 있습니다.
딥러닝 기반 화재 및 연기 감지의 고도화
최근에는 단순한 색상 및 움직임 분석을 넘어, 딥러닝(Deep Learning) 모델을 활용해 더 높은 정확도의 감지 시스템이 개발되고 있습니다.
대표적인 방법은 CNN(Convolutional Neural Network) 을 이용해 화재와 비화재 이미지를 학습시키는 것입니다.
- 데이터셋 준비
- Kaggle 등에서 “Fire and Smoke Dataset”을 다운로드
- 화재, 연기, 일반 이미지 등으로 라벨링된 데이터 구성
- 모델 학습 (TensorFlow / PyTorch)
- from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense model = Sequential([ Conv2D(32, (3,3), activation='relu', input_shape=(128,128,3)), MaxPooling2D(2,2), Conv2D(64, (3,3), activation='relu'), MaxPooling2D(2,2), Flatten(), Dense(128, activation='relu'), Dense(2, activation='softmax') ]) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
- 실시간 영상 분석
- 카메라 입력을 모델에 전달하여 화재 발생 여부를 실시간으로 판단
- 일정 확률 이상(예: 90%)의 감지 시 경보 시스템 트리거
이러한 방식은 전통적인 센서보다 훨씬 높은 정확도를 제공하며, CCTV 시스템과 통합하여 실시간 모니터링이 가능합니다.
실제 응용 분야
- 스마트 시티(Smart City) : 교통 카메라 영상에서 화재 발생 시 자동 경보
- 산불 감시 시스템(Wildfire Monitoring) : 위성 또는 드론 영상에서 연기 패턴 감지
- 공장 안전 시스템(Industrial Safety) : 화염, 불꽃, 연기 등을 자동 탐지해 조기 대응
- 지하주차장 및 실내 감시 : 환기 부족 지역에서 연기 확산 감지
결론
Python과 OpenCV, 그리고 딥러닝 기술을 활용하면 영상 기반 화재 및 연기 감지 시스템을 비교적 간단하게 구축할 수 있습니다.
기본적인 색상 및 움직임 분석만으로도 화재 감지의 가능성을 확인할 수 있으며,
딥러닝 모델을 결합하면 더욱 정교하고 안정적인 시스템으로 발전시킬 수 있습니다.
향후에는 멀티센서 융합(영상 + 온도 + 가스 감지) 기술과 결합하여
보다 안전하고 지능적인 화재 예방 시스템이 구축될 것으로 기대됩니다.
'Computer Vision + Python > 비전 프로그래밍 기초 (초급자)' 카테고리의 다른 글
| Python으로 이미지에서 색상 히스토그램(Color Histogram) 분석 및 시각화 (0) | 2025.11.13 |
|---|---|
| Python으로 이미지에서 윤곽선(Contours) 탐지 및 분석 (0) | 2025.11.13 |
| Python으로 이미지 색상 보정(Color Correction) 및 화이트 밸런스 적용 (0) | 2025.11.10 |
| Python에서 이미지 왜곡 보정(Image Undistortion) – 카메라 렌즈 교정 (0) | 2025.11.10 |
| Python에서 이미지 필터 및 변환(Image Filters) 라이브러리 제작 (0) | 2025.11.09 |