1. 개요
실시간 영상 분석을 통한 낙상 감지는 고령자 보호 및 스마트 홈 보안 시스템에서 중요한 역할을 한다. 본 방법은 카메라 영상에서 사람의 형태를 외접 사각형으로 모델링하고, 이 사각형의 기하학적 특성 변화를 기반으로 낙상을 탐지하는 방식이다. 특히, 사각형의 가로세로 비율(비율)과 질량 중심의 움직임을 주요 판별 요소로 사용하여 정확한 판단이 가능하다.
2. 처리 절차
- 영상 입력 및 프레임 추출: 동영상 파일로부터 연속된 프레임을 읽어온다.
- 전경 추출: 배경 제거 기법을 적용해 움직이는 객체를 식별한다.
- 노이즈 제거 및 객체 강화: 수학적 형태학(Morphology) 필터를 통해 전경 마스크를 정제한다.
- 객체 경계 및 최소 외접 사각형 계산: 윤곽선을 기반으로 객체를 둘러싸는 최소 크기의 사각형을 생성한다.
- 특징량 산출: 외접 사각형의 너비 대비 높이 비율과 질량 중심의 시간적 변화율을 계산한다.
- 낙상 여부 결정: 설정된 임계값을 초과하면 낙상 발생으로 간주한다.
- 결과 시각화: 원본 영상 위에 경계 상자를 표시하고, 감지 결과를 출력한다.
3. MATLAB 구현 코드
function detect_fall(videoFile)
% 영상 파일 열기
reader = VideoReader(videoFile);
if ~isvalid(reader)
error('지원되지 않는 비디오 형식입니다.');
end
% 초기 프레임 수와 배경 초기화
frameIndex = 0;
accumulatedBackground = [];
isFallen = false;
% 실시간 영상 출력기 생성
display = vision.DeployableVideoPlayer;
display.Name = 'Fall Detection Monitor';
while hasFrame(reader)
currentFrame = readFrame(reader);
frameIndex = frameIndex + 1;
% 초기 25프레임 동안 배경 모델 학습
grayImage = rgb2gray(currentFrame);
if frameIndex == 1
accumulatedBackground = grayImage;
elseif frameIndex <= 25
accumulatedBackground = max(accumulatedBackground, grayImage);
continue;
end
% 전경 마스크 생성 (배경 차분)
diffImage = abs(double(grayImage) - double(accumulatedBackground));
foregroundMask = diffImage > 25;
foregroundMask = imbinarize(foregroundMask);
% 노이즈 제거: 열림과 닫힘 연산
structElement = strel('disk', 4);
cleanedMask = imopen(foregroundMask, structElement);
cleanedMask = imclose(cleanedMask, structElement);
% 객체 윤곽 탐지
contours = bwboundaries(cleanedMask);
for objIdx = 1:length(contours)
points = contours{objIdx};
xCoords = points(:, 2);
yCoords = points(:, 1);
% 최소 외접 사각형 계산
[xMin, xMax, yMin, yMax] = boundingBox(xCoords, yCoords);
width = xMax - xMin;
height = yMax - yMin;
if height == 0
continue;
end
aspectRatio = width / height;
centerX = xMin + width / 2;
centerY = yMin + height / 2;
% 낙상 조건: 가로세로 비율이 1.6 이상일 때
if aspectRatio >= 1.6
isFallen = true;
% 빨간색 사각형으로 경고 표시
rectangle('Position', [xMin, yMin, width, height], ...
'EdgeColor', 'red', 'LineWidth', 3);
textLabel = 'FALL DETECTED';
text(currentFrame, [centerX - 40], [centerY - 10], textLabel, ...
'Color', 'red', 'FontSize', 14, 'FontWeight', 'bold');
end
end
% 현재 프레임 표시
step(display, currentFrame);
if isFallen
fprintf('경고: 낙상이 감지되었습니다.\n');
break;
end
end
release(display);
end
% 보조 함수: 좌표 집합의 경계 상자 계산
function [minX, maxX, minY, maxY] = boundingBox(x, y)
minX = min(x);
maxX = max(x);
minY = min(y);
maxY = max(y);
end
4. 실행 예시
% 낙상 감지 실행
videoPath = 'C:\Videos\test_video.mp4'; % 실제 경로로 변경
detect_fall(videoPath);
5. 주의사항 및 최적화 방향
- 배경 적응성: 조명 변화에 대응하기 위해 배경 모델을 지속적으로 업데이트하는 방식을 도입할 수 있다.
- 형태학 커널 크기: 환경에 따라 structuring element의 크기를 조정하여 소음 제거 성능을 향상시킨다.
- 임계값 조정: 다양한 실험을 통해 aspect ratio 임계값(예: 1.5~2.0)을 정밀하게 설정해야 한다.
- 여러 객체 처리: 한 프레임 내 다수의 객체가 존재할 경우, 면적이 일정 크기 이상인 객체만 처리하는 필터링이 필요하다.
- 실시간성: 고해상도 영상에서는 처리 속도를 고려해 프레임 건너뛰기 또는 해상도 축소를 적용할 수 있다.