파이썬으로 OpenCV를 이용하여 동영상에서 물체의 움직임 추정하기

이번 포스트에서는 파이썬과 OpenCV를 사용하여 동영상에서 물체의 움직임을 추정하는 방법에 대해 알아보겠습니다.

필요한 패키지 설치하기

먼저, OpenCV를 설치해야 합니다. 다음 명령어를 사용하여 OpenCV를 설치할 수 있습니다.

pip install opencv-python

동영상 불러오기

동영상을 불러오기 위해 cv2.VideoCapture() 함수를 사용합니다. 다음은 동영상 파일을 불러오는 예제입니다.

import cv2

video = cv2.VideoCapture('video.mp4')

프레임 읽기

cv2.VideoCapture() 함수로 동영상을 불러온 후, read() 함수를 사용하여 각 프레임을 읽을 수 있습니다. 읽은 프레임은 이미지로 반환됩니다.

ret, frame = video.read()

프레임 처리

읽은 프레임을 처리하여 움직임을 추정합니다. 여기서는 간단한 움직임 검출을 위해 배경 차분을 사용하는 예제를 보겠습니다.

import cv2

video = cv2.VideoCapture('video.mp4')

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

while True:
    # 다음 프레임 읽기
    ret, frame = video.read()
    
    # 프레임 전처리
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (21, 21), 0)
    
    # 배경 차분
    frame_diff = cv2.absdiff(prev_frame, gray)
    threshold = cv2.threshold(frame_diff, 30, 255, cv2.THRESH_BINARY)[1]
    
    # 움직임 영역 표시
    contours, hierarchy = cv2.findContours(threshold.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for contour in contours:
        if cv2.contourArea(contour) < 500:
            continue
        (x, y, w, h) = cv2.boundingRect(contour)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 3)
    
    # 결과 화면 출력
    cv2.imshow("Motion Detection", frame)
    
    # 'q' 키를 누르면 종료
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    
    # 현재 프레임을 이전 프레임으로 설정
    prev_frame = gray

# 작업이 끝나면 동영상 파일과 연결을 해제
video.release()
cv2.destroyAllWindows()

위의 코드는 배경 차분을 사용하여 움직임이 있는 영역을 검출하는 예제입니다. 움직임이 있는 영역은 초록색 사각형으로 표시됩니다.

결론

이렇게 파이썬과 OpenCV를 사용하여 동영상에서 물체의 움직임을 추정할 수 있습니다. 이를 응용하여 보안, 교통, 감시 등 다양한 분야에서 활용할 수 있습니다.

더 자세한 내용은 OpenCV 공식 문서를 참조하시기 바랍니다.