[python] OpenCV를 사용하여 이미지에서 움직임 감지하기

이미지 처리 및 컴퓨터 비전 작업을 위해 OpenCV는 매우 인기있는 라이브러리입니다. 이번 포스트에서는 OpenCV를 사용하여 이미지에서 움직임을 감지하는 방법에 대해 알아보겠습니다.

필요한 패키지 설치

먼저, OpenCV를 설치하기 위해 다음 명령을 사용하여 필요한 패키지를 설치합니다:

pip install opencv-python

이미지에서 움직임 감지하기

다음으로, 이미지에서 움직임을 감지하기 위한 코드를 작성해보겠습니다. 이 코드는 이미지에서 움직임을 감지하기 위해 cv2.absdiff() 함수를 사용합니다.

import cv2
import numpy as np

# 동영상 파일 로드
cap = cv2.VideoCapture('video.mp4')

# 비디오의 첫 프레임 읽기
ret, frame1 = cap.read()

# 그레이스케일로 변환
gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)

while cap.isOpened():
    # 비디오의 다음 프레임 읽기
    ret, frame2 = cap.read()
    
    if not ret:
        break
    
    # 그레이스케일로 변환
    gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
    
    # 이전 프레임과 현재 프레임의 차이 계산
    diff = cv2.absdiff(gray1, gray2)
    
    # 차이 영상 이진화
    _, thresh = cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY)
    
    # 이진화된 영상에서 움직임을 감지한 영역 구하기
    contours, _ = cv2.findContours(thresh, 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(frame2, (x, y), (x+w, y+h), (0, 255, 0), 2)
    
    # 결과 동영상 출력
    cv2.imshow("Motion Detection", frame2)
    
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
        
    # 다음 프레임을 위해 현재 프레임을 이전 프레임으로 업데이트
    gray1 = gray2

# 종료
cap.release()
cv2.destroyAllWindows()

이 코드는 cv2.VideoCapture()를 사용하여 동영상 파일을 로드하고, cv2.absdiff()를 사용하여 현재 프레임과 이전 프레임 사이의 차이를 계산합니다. 그런 다음, cv2.threshold()를 사용하여 이진화된 영상을 얻고, cv2.findContours()를 사용하여 움직임을 감지한 영역을 찾습니다. 마지막으로, cv2.rectangle()를 사용하여 움직임을 감지한 영역을 사각형으로 표시하고, cv2.imshow()를 사용하여 결과 동영상을 출력합니다.

이제 OpenCV를 사용하여 이미지에서 움직임을 감지하는 기본적인 방법을 알게되었습니다. 이를 기반으로 움직임 감지와 관련된 다양한 응용 프로그램을 개발할 수 있습니다.

참고 자료