외접 사각형 기반 인체 객체 분석을 활용한 MATLAB 낙상 감지 시스템

1. 개요

실시간 영상 분석을 통한 낙상 감지는 고령자 보호 및 스마트 홈 보안 시스템에서 중요한 역할을 한다. 본 방법은 카메라 영상에서 사람의 형태를 외접 사각형으로 모델링하고, 이 사각형의 기하학적 특성 변화를 기반으로 낙상을 탐지하는 방식이다. 특히, 사각형의 가로세로 비율(비율)과 질량 중심의 움직임을 주요 판별 요소로 사용하여 정확한 판단이 가능하다.

2. 처리 절차

  1. 영상 입력 및 프레임 추출: 동영상 파일로부터 연속된 프레임을 읽어온다.
  2. 전경 추출: 배경 제거 기법을 적용해 움직이는 객체를 식별한다.
  3. 노이즈 제거 및 객체 강화: 수학적 형태학(Morphology) 필터를 통해 전경 마스크를 정제한다.
  4. 객체 경계 및 최소 외접 사각형 계산: 윤곽선을 기반으로 객체를 둘러싸는 최소 크기의 사각형을 생성한다.
  5. 특징량 산출: 외접 사각형의 너비 대비 높이 비율과 질량 중심의 시간적 변화율을 계산한다.
  6. 낙상 여부 결정: 설정된 임계값을 초과하면 낙상 발생으로 간주한다.
  7. 결과 시각화: 원본 영상 위에 경계 상자를 표시하고, 감지 결과를 출력한다.

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)을 정밀하게 설정해야 한다.
  • 여러 객체 처리: 한 프레임 내 다수의 객체가 존재할 경우, 면적이 일정 크기 이상인 객체만 처리하는 필터링이 필요하다.
  • 실시간성: 고해상도 영상에서는 처리 속도를 고려해 프레임 건너뛰기 또는 해상도 축소를 적용할 수 있다.

태그: Matlab 낙상 감지 컴퓨터 비전 외접 사각형 배경 제거

6월 28일 23:45에 게시됨