import sysimport numpy as npimport matplotlib.pyplot as pltimport cv2from pathlib import Path
객체 추적
folder = "fig"
평균 이동 (Mean shift)
# (function) def meanShift( probImage: MatLike, window: Rect, criteria: TermCriteria# ) -> tuple[int, Rect]# probImage: 히스토그램 역투영 영상 (확률 영상)# window: 초기 검색 영역 윈도우# criteri: 종료 기준
import sysimport numpy as npimport cv2# 비디오 파일 열기# cap = cv2.VideoCapture('./fig/Billard.mp4')cap = cv2.VideoCapture(Path(folder, "Billard.mp4"))if not cap.isOpened(): print('Video open failed!') sys.exit()ret, frame = cap.read()if not ret: print('frame read failed!') sys.exit()(x, y, w, h) = cv2.selectROI('ROI', frame)rc = (x, y, w, h)roi = frame[y:y+h, x:x+w]roi_hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)# HS 히스토그램 계산channels = [0, 1]ranges = [0, 180, 0, 256]hist = cv2.calcHist([roi_hsv], channels, None, [90, 128], ranges)# Mean Shift 알고리즘 종료 기준term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)# 비디오 매 프레임 처리while True: ret, frame = cap.read() if not ret: break # HS 히스토그램에 대한 역투영 frame_hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) backproj = cv2.calcBackProject([frame_hsv], channels, hist, ranges, 1) # Mean Shift _, rc = cv2.meanShift(backproj, rc, term_crit) # 추적 결과 화면 출력 cv2.rectangle(frame, rc, (0, 0, 255), 2) cv2.imshow('frame', frame) if cv2.waitKey(20) == 27: breakcap.release()cv2.destroyAllWindows()
캠시프트 (Camshift)
import sysimport numpy as npimport cv2# 비디오 파일 열기cap = cv2.VideoCapture(Path(folder, "Billard.mp4"))if not cap.isOpened(): print('Video open failed!') sys.exit()ret, frame = cap.read()if not ret: print('frame read failed!') sys.exit()(x, y, w, h) = cv2.selectROI('ROI', frame)rc = (x, y, w, h)roi = frame[y:y+h, x:x+w]roi_hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)# HS 히스토그램 계산channels = [0, 1]ranges = [0, 180, 0, 256]hist = cv2.calcHist([roi_hsv], channels, None, [90, 128], ranges)# CamShift 알고리즘 종료 기준term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)# 비디오 매 프레임 처리while True: ret, frame = cap.read() if not ret: break # HS 히스토그램에 대한 역투영 frame_hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) backproj = cv2.calcBackProject([frame_hsv], channels, hist, ranges, 1) # CamShift ret, rc = cv2.CamShift(backproj, rc, term_crit) # 추적 결과 화면 출력 cv2.rectangle(frame, rc, (0, 0, 255), 2) cv2.ellipse(frame, ret, (0, 255, 0), 2) cv2.imshow('frame', frame) if cv2.waitKey(60) == 27: breakcap.release()cv2.destroyAllWindows()
모션 벡터 (Motion vector)
Lucas-Kanade optical flow
# def calcOpticalFlowPyrLK(# prevImg: MatLike, 첫 번째 frame# nextImg: MatLike, 두 번째 frame# prevPts: MatLike, 첫 번째 points# nextPts: MatLike,# status: MatLike | None = ...,# err: MatLike | None = ...,# winSize: Size = ...,# maxLevel: int = ...,# criteria: TermCriteria = ...,# flags: int = ...,# minEigThreshold: float = ...# ) -> tuple[nextPts:MatLike, status:atLike, err:MatLike]