파이썬과 OpenCV를 사용한 동영상에서 차량 속도 추정하기

이번 글에서는 파이썬과 OpenCV를 사용하여 동영상에서 차량의 속도를 추정하는 방법에 대해 알아보겠습니다. 차량 속도 추정은 교통 공학, 자율 주행 등 다양한 분야에서 중요한 요소로 사용됩니다. 이를 위해 우리는 객체 감지와 객체 추적의 개념을 사용하여 차량의 위치 변화를 추적하고, 프레임 간의 거리 변화를 측정하여 속도를 계산합니다.

필요한 라이브러리 설치

먼저, 해당 프로젝트에 필요한 라이브러리를 설치해야 합니다.

pip install opencv-python

동영상에서 차량 추적

동영상에서 차량을 추적하기 위해 우리는 먼저 객체 감지를 수행해야 합니다. 여러 가지 객체 감지 알고리즘 중에서 Haar Cascade 분류기를 사용해 보겠습니다. Haar Cascade 분류기는 이미지의 특징을 기반으로 강력한 객체 감지를 수행하는 알고리즘입니다.

import cv2

# Haar Cascade 분류기 로드
car_cascade = cv2.CascadeClassifier('car_cascade.xml')

# 동영상 파일 열기
cap = cv2.VideoCapture('traffic.mp4')

while cap.isOpened():
    ret, frame = cap.read()
    
    # 프레임의 크기를 축소
    frame = cv2.resize(frame, (640, 480))

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

    # 차량 감지
    cars = car_cascade.detectMultiScale(gray, 1.1, 3)

    for (x, y, w, h) in cars:
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)

    # 프레임 출력
    cv2.imshow('Video', frame)
    
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

위 코드는 동영상에서 차량을 감지하고, 감지된 차량에 사각형을 그리는 예시입니다. cv2.CascadeClassifier를 사용하여 사전에 학습된 Haar Cascade 분류기를 로드하고, detectMultiScale 메서드를 사용하여 차량을 감지합니다.

차량 속도 계산

차량의 속도를 계산하기 위해서는 차량의 좌표 변화를 추적해야 합니다. 이를 위해 이전 프레임에서 감지된 차량의 위치와 현재 프레임에서 감지된 차량의 위치를 비교합니다.

import cv2
import numpy as np

# 동영상 파일 열기
cap = cv2.VideoCapture('traffic.mp4')

ret, frame1 = cap.read()
ret, frame2 = cap.read()

while cap.isOpened():
    # 프레임의 크기를 축소
    frame1 = cv2.resize(frame1, (640, 480))
    frame2 = cv2.resize(frame2, (640, 480))

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

    # 차량 감지
    cars1 = car_cascade.detectMultiScale(gray1, 1.1, 3)
    cars2 = car_cascade.detectMultiScale(gray2, 1.1, 3)

    for (x1, y1, w1, h1) in cars1:
        for (x2, y2, w2, h2) in cars2:
            # 중심 좌표 계산
            cx1 = x1 + (w1 // 2)
            cy1 = y1 + (h1 // 2)
            cx2 = x2 + (w2 // 2)
            cy2 = y2 + (h2 // 2)

            # 거리 계산
            distance = np.sqrt((cx2 - cx1)**2 + (cy2 - cy1)**2)

            # 속도 계산 (예: 프레임당 픽셀 거리)
            speed = distance / 30

            # 프레임 출력
            cv2.imshow('Video', frame2)
            cv2.putText(frame2, f'Speed: {speed:.2f} km/h', (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

    if cv2.waitKey(25) & 0xFF == ord('q'):
        break

    frame1 = frame2
    ret, frame2 = cap.read()

cap.release()
cv2.destroyAllWindows()

위 코드에서는 이전 프레임과 현재 프레임에서 차량을 감지하고, 좌표 변화를 계산하여 차량의 속도를 추정합니다. np.sqrt 함수를 사용하여 좌표 변화의 거리를 계산하고, distance를 프레임당 픽셀 거리로 나누어 속도를 계산합니다. 이를 화면에 출력하기 위해 cv2.putText를 사용하여 속도 값을 출력합니다.

결론

이 글에서는 파이썬과 OpenCV를 사용하여 동영상에서 차량의 속도를 추정하는 방법을 알아보았습니다. 객체 감지와 추적을 통해 차량의 위치 변화를 추적하고, 프레임 간의 거리 변화를 계산하여 속도를 구하는 방식을 살펴보았습니다. 이를 기반으로 교통 공학이나 자율 주행 등 다양한 분야에서 차량 속도 추정을 활용할 수 있습니다.

#연예인따라하기 #OpenCV