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

동영상에서 움직임을 감지하고 유추하는 것은 컴퓨터 비전과 인공지능 분야에서 널리 사용되는 기술입니다. 여기에서는 파이썬과 OpenCV 라이브러리를 사용하여 동영상에서 움직임을 감지하고 유추하는 방법을 알아보겠습니다.

1. OpenCV 설치하기

먼저, OpenCV를 설치해야 합니다. 다음 명령어를 사용하여 파이썬에 필요한 패키지를 설치할 수 있습니다.

pip install opencv-python

2. 동영상 불러오기

동영상에서 움직임을 감지하기 위해서는 동영상 파일을 불러와야 합니다. 아래의 코드를 사용하여 동영상을 불러올 수 있습니다.

import cv2

# 동영상 파일 열기
video = cv2.VideoCapture("동영상 파일 경로")

3. 움직임 감지하기

불러온 동영상에서 움직임을 감지하기 위해 프레임마다 차이를 계산해야 합니다. 다음 코드는 현재 프레임과 이전 프레임 간의 차이를 계산하는 예시입니다.

import cv2

# 이전 프레임 초기화
prev_frame = None

while True:
    # 동영상에서 프레임 읽기
    ret, frame = video.read()
    
    # 동영상의 끝에 도달했다면 종료
    if not ret:
        break
        
    # 현재 프레임을 그레이스케일로 변환
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    # 현재 프레임과 이전 프레임 비교
    if prev_frame is not None:
        frame_diff = cv2.absdiff(prev_frame, gray)
        
        # 움직임이 감지된 픽셀 추출
        motion_mask = cv2.threshold(frame_diff, 30, 255, cv2.THRESH_BINARY)[1]
        
        # 추출된 움직임 마스크를 화면에 표시
        cv2.imshow("Motion Mask", motion_mask)
    
    # 현재 프레임을 이전 프레임으로 갱신
    prev_frame = gray
    
    # 키보드 입력을 위한 대기 시간 설정
    if cv2.waitKey(1) == ord("q"):
        break

# 동영상 파일 닫기
video.release()
cv2.destroyAllWindows()

4. 움직임 유추하기

움직임을 유추하기 위해서는 움직임이 감지된 픽셀의 위치를 추적해야 합니다. 아래의 코드는 움직임이 감지된 픽셀의 위치를 추적하는 예시입니다.

import cv2
import numpy as np

# 이전 프레임 초기화
prev_frame = None

while True:
    # 동영상에서 프레임 읽기
    ret, frame = video.read()
    
    # 동영상의 끝에 도달했다면 종료
    if not ret:
        break
    
    # 현재 프레임을 그레이스케일로 변환
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    # 현재 프레임과 이전 프레임 비교
    if prev_frame is not None:
        frame_diff = cv2.absdiff(prev_frame, gray)
        
        # 움직임이 감지된 픽셀 추출
        motion_mask = cv2.threshold(frame_diff, 30, 255, cv2.THRESH_BINARY)[1]
        
        # 추출된 움직임 마스크에서 움직임이 있는 좌표를 추출
        points = np.transpose(np.nonzero(motion_mask))
        
        # 추출된 좌표를 화면에 표시
        for point in points:
            x, y = point
            cv2.circle(frame, (y, x), 2, (0, 0, 255), -1)

        # 표시된 화면 출력
        cv2.imshow("Motion Tracking", frame)
    
    # 현재 프레임을 이전 프레임으로 갱신
    prev_frame = gray
    
    # 키보드 입력을 위한 대기 시간 설정
    if cv2.waitKey(1) == ord("q"):
        break

# 동영상 파일 닫기
video.release()
cv2.destroyAllWindows()

5. 결론

이렇게 파이썬과 OpenCV를 이용하여 동영상에서 움직임을 감지하고 유추하는 방법을 알아보았습니다. 이 기술을 응용하여 사물의 움직임을 감지하거나 추적하는 등 다양한 분야에서 활용할 수 있습니다. OpenCV의 다양한 함수와 기능을 활용하여 움직임 유추를 보다 정확하게 할 수 있습니다.

참고자료:

  1. OpenCV 공식 문서: https://docs.opencv.org
  2. “Python for Computer Vision with OpenCV and Deep Learning” (Jose Portilla) 책