Object Tracking - 2

qkdk·2024년 8월 26일

openCV

목록 보기
10/15

MeanShift 알고리즘

클러스터의 중심으로 이동하는 알고리즘

  • 클러스터의 밀도가 가장높은곳이 중심이 될때까지 반복해서 이동

    연두색 주황색으로 클러스터의 중심이 이동

    MeanShift를 활용한 객체 추적 과정

BackProjection

  • 히스토그램 역투영
  • 여러 색상이나 특징을 가진 객체를 이미지에서 추적하는 기법
  • 관심 영역의 히스토그램을 계산하고, 이 히스토그램을 이용해 유사한 영역을 찾아냄
roi를 추출한 이미지BackProjection을 적용할 이미지BackProjection을 적용한 결과

진행과정

  1. 기존의 이미지에서 추적할 이미지의 roi를 추출
  2. BackProjection 역추적을 활용해 추출한 roi와 유사한 객체 추적
  3. BackProjection 이 끝난 이미지에 meanShift 알고리즘을 적용해 객체를 추적

cv2.meanShift

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

ret, frame = cap.read()

# 처음에만 얼굴을 탐지하고, 이후 meanshift에 의해서 추적하게 하도록
# haar cascade 방법 사용
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
face_rects = face_cascade.detectMultiScale(frame)

(face_x, face_y, w, h) = tuple(face_rects[0])
track_window = (face_x, face_y, w, h)

# 얼굴을 찾고, 찾은부의 roi 계산 및 히스토그램 추출
roi = frame[face_y:face_y+h, face_x:face_x+w]
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
roi_hist = cv2.calcHist([hsv_roi], [0], None, [180], [0, 180])
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)  

# meanShift에 사용할 파라미터
term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)

while True:
    ret, frame = cap.read()

    if ret == True:
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        # 히스토그램 역추적
        dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
        # 객체 추적
        ret, track_window = cv2.meanShift(dst, track_window, term_crit)

        x, y, w, h = track_window
        img2 = cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 5)

        cv2.imshow('img', img2)

        k = cv2.waitKey(1) & 0xff
        if k == 27:
            break
    else:
        break

cap.release()
cv2.destroyAllWindows()

cv2.calcBackProject

dst = cv2.calcBackProject(images, channels, hist, ranges, scale)

매개변수

  1. images:

    • 입력 이미지의 리스트입니다. 대부분 단일 이미지를 포함한 리스트로 사용됩니다. 예: [image].
  2. channels:

    • 분석할 채널의 인덱스를 나타냅니다. 예를 들어, HSV 색 공간에서 H 채널만 사용하고 싶다면 [0]가 됩니다. 색상 히스토그램을 계산할 때 2개의 채널을 사용할 수도 있습니다(예: [0, 1] for H and S channels).
  3. hist:

    • 참조할 히스토그램입니다. 보통 cv2.calcHist를 사용하여 미리 계산한 히스토그램입니다.
  4. ranges:

    • 분석할 각 채널의 범위를 지정하는 리스트입니다. 예를 들어, HSV 색 공간에서 H 채널의 범위를 [0, 180]로 설정할 수 있습니다. 각 채널마다 범위를 지정해야 합니다.
  5. scale:

    • 결과 이미지를 확장하는 데 사용하는 변수입니다. 일반적으로 1로 설정합니다.

반환값

  • dst:
    • 입력 이미지와 동일한 크기의 단일 채널 출력 이미지로, 각 픽셀 값은 해당 픽셀이 주어진 히스토그램과 얼마나 일치하는지를 나타냅니다.

cv2.minShift

ret, track_window = cv2.meanShift(probImage, window, criteria)

매개변수

  1. probImage:
    • 역투영된 이미지 (probability image). 보통 cv2.calcBackProject 함수를 사용하여 생성된 이미지입니다.
  2. window:
    • 초기 추적 창(Tracking window). 추적할 객체의 초기 위치로, (x, y, w, h) 형식의 튜플입니다. x, y는 창의 좌상단 좌표이고, w, h는 창의 너비와 높이입니다.
  3. criteria:
    • 종결 기준(Termination criteria)으로, 알고리즘이 언제 멈출지 결정합니다. 예를 들어, 최대 반복 횟수나 특정 정확도 등에 도달했을 때 멈춥니다.
    • criteria는 일반적으로 cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, max_iter, epsilon 형태로 설정됩니다.

반환값

  1. ret:
    • 반복 후의 Mean Shift 알고리즘 실행 결과. 반복 횟수가 반환됩니다.
  2. track_window:
    • 업데이트된 추적 창(Tracking window). 최종 추적된 객체의 위치입니다.

CAMShift 알고리즘

MeanShift에서 영역의 크기가 고정되어있는 단점을 극복한 알고리즘, 지속적으로 영역의 크기를 계산해 업뎅이트 한다.

        ################################
        ret, track_window = cv2.CamShift(dst, track_window, term_crit)

        pts = cv2.boxPoints(ret)
        pts = np.int0(pts)
        img2 = cv2.polylines(frame, [pts], True, (0, 0, 255), 5)
        ################################
  • 기존 코드에서 CamShift로 메서드만 변경시켜주면 Camshift알고리즘을 사용할수 있다.
  • 변화하는 이미지를 추적하기 위해 Rectangle 대신 PolyLine을 사용
profile
qkdk

0개의 댓글