[파이썬] opencv-python 모션 분석 및 객체 추적

opencv-python

OpenCV-Python은 오픈소스 컴퓨터 비전 라이브러리인 OpenCV를 파이썬에서 사용할 수 있도록 한 패키지입니다. 이 패키지를 사용하면 영상/동영상 처리, 모션 분석, 객체 추적 등의 작업을 파이썬으로 간편하게 할 수 있습니다.

이 글에서는 OpenCV-Python을 사용하여 모션 분석 및 객체 추적을 어떻게 수행하는지 알아보겠습니다. 예제 코드와 함께 설명하므로 실습도 해보시면 더욱 도움이 될 것입니다.

모션 분석

모션 분석은 동영상에서 움직임이 있는 영역을 감지하고 분석하는 작업을 의미합니다. 이를 통해 보안 시스템에서 이상 행동 감지, 트래픽 모니터링, 자동차 주행 보조 시스템 등에 활용할 수 있습니다.

import cv2

# 비디오 파일 불러오기
video = cv2.VideoCapture('video.mp4')

# 배경 제거 알고리즘 생성
fgbg = cv2.createBackgroundSubtractorMOG2()

# 비디오 프레임 읽기
while True:
    ret, frame = video.read()
    if not ret:
        break
    
    # 배경 제거를 통한 이진 영상 생성
    fgmask = fgbg.apply(frame)
    
    # 이진 영상에서 움직임 영역을 찾아서 경계 상자 그리기
    contours, _ = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for contour in contours:
        x, y, w, h = cv2.boundingRect(contour)
        if w > 50 and h > 50:
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
    
    # 결과 출력
    cv2.imshow('Motion Detection', frame)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 비디오 종료
video.release()
cv2.destroyAllWindows()

위 코드는 비디오 파일에서 모션을 감지하고 모션 영역을 표시하는 예제입니다. 비디오 파일을 cv2.VideoCapture로 불러온 후, cv2.createBackgroundSubtractorMOG2를 사용하여 배경 제거를 위한 알고리즘을 생성합니다. 그 다음, 프레임을 읽어와서 배경 제거를 적용하고, 이진 영상에서 움직임 영역을 찾아 경계 상자를 그립니다.

객체 추적

객체 추적은 움직이는 객체를 지속적으로 추적하고 해당 객체의 경로를 추적하는 작업을 의미합니다. 이를 통해 자동차 추적, 보안 감시, 스포츠 분석 등 다양한 응용분야에서 활용됩니다.

import cv2

# 비디오 파일 불러오기
video = cv2.VideoCapture('video.mp4')

# 추적기 선택
tracker = cv2.TrackerCSRT_create()

# 첫 프레임에서 객체 추적을 시작할 영역 선택
ret, frame = video.read()
bbox = cv2.selectROI('Object Tracking', frame, False)

# 추적기 초기화
tracker.init(frame, bbox)

# 프레임 읽기
while True:
    ret, frame = video.read()
    if not ret:
        break
    
    # 객체 추적
    success, bbox = tracker.update(frame)
    
    # 추적된 객체의 위치로 경계 상자 그리기
    if success:
        x, y, w, h = [int(v) for v in bbox]
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
    else:
        cv2.putText(frame, 'Tracking Failure', (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
    
    # 결과 출력
    cv2.imshow('Object Tracking', frame)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 비디오 종료
video.release()
cv2.destroyAllWindows()

위 코드는 비디오 파일에서 객체를 추적하고 추적된 객체의 경계 상자를 표시하는 예제입니다. 영상에서 객체를 추출하기 위해 cv2.selectROI를 사용하여 첫 프레임에서 객체를 선택한 후, cv2.TrackerCSRT_create를 사용하여 추적기를 선택합니다. 그 다음, 추적기를 초기화하고 프레임을 읽어와서 추적을 수행하고 추적된 객체의 위치로 경계 상자를 그립니다.

OpenCV-Python을 사용하면 모션 분석과 객체 추적을 비교적 간단하게 구현할 수 있습니다. 이러한 기능을 활용하여 다양한 영상 처리 및 컴퓨터 비전 애플리케이션을 개발할 수 있습니다. 더 자세한 내용은 OpenCV-Python 공식 문서를 참고하시기 바랍니다.