OpenCV 강좌, 동작 인식 기초 (Frame Difference, Background Subtraction)

글로벌 범위에서의 영상 처리 기술은 다양한 애플리케이션에 활용되고 있습니다. 특히, 보안 시스템, 자동 주차 시스템, 스포츠 분석 등 다양한 분야에서 동작 인식 기술이 필요합니다. 이번 강좌에서는 OpenCV 라이브러리를 사용하여 기본적인 동작 인식 기법인 Frame Difference와 Background Subtraction에 대해 자세히 알아보겠습니다.

1. OpenCV 소개

OpenCV(Open Source Computer Vision Library)는 주로 실시간 컴퓨터 비전을 위한 라이브러리입니다. C++, Python 및 Java와 같은 다양한 프로그래밍 언어를 지원하며, 이미지 및 비디오 처리, 객체 인식, 동작 인식 등 다양한 기능을 제공합니다.

1.1 OpenCV 설치하기

Python에서 OpenCV를 사용하기 위해서는 먼저 OpenCV 라이브러리를 설치해야 합니다. Python pip 패키지 관리자를 사용하여 쉽게 설치할 수 있습니다.

pip install opencv-python

2. 동작 인식 개요

동작 인식은 일정 시간 동안의 영상 흐름을 분석하여 시각적 패턴이나 행동을 식별하는 기술입니다. 이 강좌에서는 두 가지 기법인 Frame Difference와 Background Subtraction을 다룹니다.

3. Frame Difference

Frame Difference는 연속된 두 프레임 간의 차이를 계산하여 동작을 인식하는 간단한 기법입니다. 이 방법은 주로 고정된 배경에서 움직이는 물체를 인식하는 데 사용됩니다.

3.1 Frame Difference 원리

이 방법은 현재 프레임과 이전 프레임을 비교하여 차이가 있는 영역을 찾아내는 방식입니다. 큰 차이가 있는 픽셀들은 움직이는 물체로 간주할 수 있습니다.

3.2 Frame Difference 예제 코드

아래는 Frame Difference를 이용한 동작 인식의 예제 코드입니다.


import cv2

# 비디오 캡처 객체 생성
cap = cv2.VideoCapture(0)

# 첫 번째 프레임 읽기
ret, prev_frame = cap.read()
prev_frame = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY)

while True:
    # 현재 프레임 읽기
    ret, current_frame = cap.read()
    current_frame_gray = cv2.cvtColor(current_frame, cv2.COLOR_BGR2GRAY)

    # Frame Difference 계산
    frame_diff = cv2.absdiff(prev_frame, current_frame_gray)
    _, thresh = cv2.threshold(frame_diff, 30, 255, cv2.THRESH_BINARY)

    # 동작 인식 결과 출력
    cv2.imshow('Frame Difference', thresh)

    # 이전 프레임을 현재 프레임으로 업데이트
    prev_frame = current_frame_gray.copy()

    # 'q'를 눌러 프로그램 종료
    if cv2.waitKey(1) == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
    

이 코드는 웹캠에서 비디오를 캡처하여 연속적인 프레임 간의 차이를 계산하고, 차이가 있는 영역을 이진화하여 보여줍니다. 동작이 감지되면 흰색으로 표시되며, 사용자가 ‘q’ 키를 누르면 종료됩니다.

4. Background Subtraction

Background Subtraction은 동작 인식을 위한 또 다른 인기 있는 기법입니다. 이 방법은 정적인 배경과 동적인 객체를 분리하여 동작을 인식합니다. 이 과정은 일반적으로 두 단계로 진행됩니다: 배경 모델링 및 배경과의 차이 계산입니다.

4.1 Background Subtraction 원리

이 기법은 동영상 스트림s의 배경을 추정하고, 이를 기준으로 물체의 움직임을 추적합니다. 일반적으로 cv2.createBackgroundSubtractorMOG2()와 같은 메소드를 사용하여 배경 모델을 생성할 수 있습니다.

4.2 Background Subtraction 예제 코드

아래는 Background Subtraction을 사용한 예제 코드입니다.


import cv2

# Background Subtractor 객체 생성
backSub = cv2.createBackgroundSubtractorMOG2()

# 비디오 캡처 객체 생성
cap = cv2.VideoCapture(0)

while True:
    # 현재 프레임 읽기
    ret, frame = cap.read()
    if not ret:
        break

    # Background Subtraction 수행
    fg_mask = backSub.apply(frame)

    # 동작 인식 결과 출력
    cv2.imshow('Foreground Mask', fg_mask)

    # 'q'를 눌러 프로그램 종료
    if cv2.waitKey(1) == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
    

이 코드는 Background Subtractor를 사용하여 동작 인식 결과를 출력합니다. 동작이 감지되면 전경 마스크가 업데이트되어 나타납니다.

5. 결론

이번 강좌에서는 OpenCV를 이용한 동작 인식의 기초 기법인 Frame Difference와 Background Subtraction에 대해 알아보았습니다. 두 기법 모두 비교적 간단하면서도 강력한 기능을 가지고 있어, 실시간 영상 처리 및 동작 인식에 널리 사용됩니다. 이 기초 개념을 바탕으로 다양한 응용 프로그램에 활용해 보시길 바랍니다.

6. 참고자료

© 2023 OpenCV 블로그. 모든 권리 보유.