728x90
# 객체 추적 알고리즘 소개
움직이는 객체를 식별하고, 그 위치를 추적하는 방법을 의미합니다. 이를 통해 동영상이나 실시간 스트리밍 데 이터에서 객체의 움직임을 감지하고, 객체를 추적하는데 사용됩니다. 다음은 일반적으로 사용되는 몇 가지 객 체 추적 알고리즘입니다.
특징점 기반 추적 (Feature-based Tracking):
- 특징점기반 추적은객 체의 특징점을 검출하고, 이를 기반으로 객체를 추적합니다.
- SIFT (Scale-Invariant Feature Transform), SURF (Speeded-Up Robust Features), ORB (Oriented FAST and Rotated BRIEF) 등의 알고리즘을 사용하여 특징점을 검출합니다.
- 이 특징점들은 다음 프레임에서 찾아지며, 매칭을 통해 객체의 움직임을 추적합니다.
- 특징점의 일치도와 거리를 기반으로 가장 좋은매칭을 찾는 알고리즘을 사용합니다.
# 특징점 기반 추적 순서
특징점 기반 추적(Feature-based Tracking)에서 일반적으로 따르는 순서는 다음과 같습니다
초기화 단계:
1. 첫번째 프레임을 읽고 흑백 이미지로 변환합니다.
2. Shi-Tomasi 코너 검출기 또는 다른 특징 점검출방법을 사용하여 초기 추적 지점을선택합니다.
3. 추적할 특징점의 초기위치를 저장합니다.
import cv2
import numpy as np
# 동영상 파일 읽기
cap = cv2.VideoCapture("MS/CV/0612 객체탐지,추적/data/slow_traffic_small.mp4")
# 코너 검출기 파라미터 설정
feature_params = dict(maxCorners=100, qualityLevel=0.3,
minDistance=7, blockSize=7)
"""
maxCorners: 검출할 최대 특징점 수를 지정. 여기서는 최대 100개의 특징점을 검출하도록 설정
qualityLevel: 특징점으로 인정되기 위한 품질 기준. 0과 1 사이의 값,높을수록 특징점으로 인정되기 위한 조건이 엄격
minDistance: 검출된 특징점들 간의 최소 거리를 나타냄 이 거리보다 가까운 특징점은 제거
blockSize: 특징점 검출 시 사용되는 이웃 픽셀 블록의 크기. 특징점 검출 알고리즘에서 사용되는 계산에 영향을 미치는 요소
"""
# 광학 흐름 파라미터 설정
lk_params = dict(winSize=(30, 30), maxLevel=2, criteria=( # 알고리즘 중지기준
cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03)) # eps정확도가 criteria[0]보다 작을때까지 or count는 반복회수가 criteria[1]보다 작을때 까지 추적
"""
winSize=(30, 30): 이동 벡터를 추정하기 위해 사용되는 윈도우(window)의 크기
윈도우 크기는 광학 흐름 알고리즘에서 이웃 픽셀들 간의 관계를 분석하는 데 사용되는 영역의 크기를 조절
maxLevel=2: 피라미드 계층의 수
광학 흐름 알고리즘은 다단계의 피라미드 구조를 사용하여 이미지의 해상도를 다양하게 처리
"""
# 첫 프레임 읽기
ret, next_frame = cap.read()
prev_gray = cv2.cvtColor(next_frame, cv2.COLOR_BGR2GRAY)
# 초기 추적 지점 선택
prev_corners = cv2.goodFeaturesToTrack(prev_gray, mask=None, **feature_params)
prev_points = prev_corners.squeeze()
# 추적 결과를 표시하기위한 색상 설정
color = (0, 200, 0)
while True:
# 다음 프레임 읽기
ret, next_frame = cap.read()
if not ret:
break
# 현재 프레임 변환
gray = cv2.cvtColor(next_frame, cv2.COLOR_BGR2GRAY)
# 옵티컬 플로우 계산
next_points, status, err = cv2.calcOpticalFlowPyrLK(
prev_gray, gray, prev_points, None, **lk_params)
# 추적 결과를 좋은 포인트로 필터링
for i, (prev_point, next_point) in enumerate(zip(prev_points, next_points)):
x_prev, y_prev = prev_point.astype(np.int32)
x_next, y_next = next_point.astype(np.int32)
# cv2.line(prev_frame, (x_prev, y_prev), (x_next, y_next), color, 2)
cv2.circle(next_frame, (x_next, y_next), 3, color, 3)
# 화면에 출력
cv2.imshow("OpticalFlow-LK", next_frame)
# 다음 프레임을 위한 프레임과 포인트 저장
prev_gray = gray.copy()
prev_points = next_points
# 'q'를 누르면 종료
if cv2.waitKey(60) == ord('q'):
break
# 해제
cap.release()
cv2.destroyAllWindows()

728x90
'ComputerVision > [CV]' 카테고리의 다른 글
[CV] 영상 기본 세팅 6 (특징점기반 추적 feat, ORB + 불필요 특징점 제거2) (0) | 2023.06.12 |
---|---|
[CV] 영상 기본 세팅 5 (특징점기반 추적 feat, sift + 불필요 특징점 제거1) (0) | 2023.06.12 |
[CV] 영상 기본 세팅 3 (filter이해하기 feat, kalman) (1) | 2023.06.12 |
[CV] 영상 기본 세팅 2 (객체추적) (0) | 2023.06.12 |
[CV] 이미지 기본세팅 8 (확장 - dilation, 침식 - erosion) (0) | 2023.06.08 |