# 객체 추적 알고리즘 소개
움직이는 객체를 식별하고, 그 위치를 추적하는 방법을 의미합니다. 이를 통해 동영상이나 실시간 스트리밍 데 이터에서 객체의 움직임을 감지하고, 객체를 추적하는데 사용됩니다. 다음은 일반적으로 사용되는 몇 가지 객 체 추적 알고리즘입니다.
칼만 필터 추적 (Kalman Filter Tracking):
1. 칼만필터는 상태추정에 사용되는 필터링 기술로, 객체추적에도 적용됩니다.
2. 초기예측과 실제관측을 기반으로 객체의 위치와 속도를 추정합니다.
3. 예측과 관측간의 오차를 고려하여 정확한 위치를 업데이트합니다.
4. 이를 통해 움직이는 객체의 경로를 추적하고, 예측을 통해 불확실성을 줄입니다.
측정 행렬(Measurement Matrix): 측정 행렬은 시스템의 상태를 측정값으로 변환하는 역할을 합니다. 측정 행렬은 상태 벡터와 측정 벡터 사이의 선형 변환을 정의합니다. 일반적으로 센서로부터 얻은 측정값을 상태 벡터의 선형 조합으로 표현하는 데 사용됩니다. 측정 행렬은 시스템의 동작과 측정 방식에 따라 결정되며, 변하지 않는 고정된 행렬입니다.
전이 행렬(Transition Matrix): 전이 행렬은 시스템의 상태를 현재 상태에서 다음 상태로 변환하는 역할을 합니다. 전이 행렬은 시스템의 동적 모델을 반영하여 상태 벡터를 현재 상태에서 다음 상태로 예측하는 데 사용됩니다. 전이 행렬은 시간에 따라 변할 수 있으며, 시스템의 동작을 모델링하는 데 사용되는 다른 행렬들과 연결되어 시스템의 상태 추정에 영향을 미칩니다.
import cv2
import numpy as np
kalman = cv2.KalmanFilter(4,2)
kalman.measurementMatrix = np.array([[1,0,0,0],[0,1,0,0]],np.float32)
kalman.transitionMatrix = np.array([[1,0,1,0],[0,1,0,1],[0,0,1,0],[0,0,0,1]],np.float32)
kalman.processNoiseCov = np.array([[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],np.float32) * 0.05
cap = cv2.VideoCapture("MS/데이터전처리/0612/data/slow_traffic_small.mp4")
ret, frame = cap.read()
print(ret, frame)
x, y, w, h = cv2.selectROI(frame, False, False)
"""
"Select Object": 객체를 선택할 때 표시될 창의 제목입니다.
frame: 이미지나 비디오 프레임을 나타내는 변수입니다.
False: 선택한 영역을 자동으로 크롭하지 않고, 선택한 영역의 좌표와 크기를 반환합니다.
False: 마우스 이벤트를 사용하여 객체의 영역을 선택할 수 있도록 합니다.
"""
print("선택한 박스의 좌표 >>", x, y, w, h)
kalman.statePre = np.array([[x],[y],[0],[0]],np.float32)
while True:
ret, frame = cap.read()
if not ret:
break
kalman.correct(np.array([[np.float32(x)+w/2],[np.float32(y)+h/2]]))
kalman.predict()
predicted_bbox = tuple(map(int, kalman.statePost[:2,0]))
"""
map(int, kalman.statePost[:2,0]): 상태 벡터의 값들을 int 함수를 사용하여 정수로 변환
map 함수는 시퀀스의 모든 요소에 함수를 적용하여 새로운 시퀀스를 생성
여기서는 상태 벡터의 값을 int 함수를 사용하여 정수로 변환
"""
cv2.rectangle(frame, (predicted_bbox[0]-w//2, predicted_bbox[1]-h//2),
(predicted_bbox[0]+w//2, predicted_bbox[1]+h//2),
(0,255,255), 2)
cv2.imshow("frame", frame)
if cv2.waitKey(60) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
import cv2
import numpy as np
kalman = cv2.KalmanFilter(4,2)
kalman.measurementMatrix = np.array([[1,0,0,0],
[0,1,0,0]],np.float32)
kalman.transitionMatrix = np.array([[1,0,1,0],[0,1,0,1],[0,0,1,0],[0,0,0,1]],np.float32)
kalman.processNoiseCov = np.array([[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]],np.float32) * 0.05
cap = cv2.VideoCapture("MS/데이터전처리/0612/data/slow_traffic_small.mp4")
ret, frame = cap.read()
print(ret, frame)
x, y, w, h = cv2.selectROI(frame, False, False)
print("선택한 박스의 좌표 >>", x, y, w, h)
kalman.statePre = np.array([[x],[y],[0],[0]],np.float32)
while True:
ret, frame = cap.read()
if not ret:
break
kalman.correct(np.array([[np.float32(x)+w/2],[np.float32(y)+h/2]]))
kalman.predict()
predicted_bbox = tuple(map(int, kalman.statePost[:2,0]))
cv2.rectangle(frame, (predicted_bbox[0]-w//2, predicted_bbox[1]-h//2),
(predicted_bbox[0]+w//2, predicted_bbox[1]+h//2),
(0,255,255), 2)
cv2.imshow("frame", frame)
if cv2.waitKey(60) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()