MeanShift
和 CamShift
都是用于目標跟蹤的算法,基于顏色直方圖的方法。它們主要用于在視頻序列中追蹤運動的對象。
-
MeanShift(均值漂移):
-
原理: MeanShift 算法的基本思想是通過不斷調整窗口的中心,使得窗口中的樣本點的平均值向目標的密度最大的區域移動。具體來說,它使用核密度估計來尋找樣本分布的最大概率密度,并將窗口中心移動到密度最大的位置。
-
應用: MeanShift 在靜止相機下的目標跟蹤中表現較好,但對于一些場景變化較大、目標形變明顯的情況,可能會出現跟蹤不穩定的問題。
-
-
CamShift(連續自適應均值漂移):
-
原理: CamShift 是 MeanShift 的改進版本,主要是在 MeanShift 的基礎上增加了對目標的尺度變化和旋轉的適應性。CamShift 在追蹤時可以調整窗口的大小和方向,從而適應目標的尺度和旋轉變化。
-
應用: CamShift 在相機運動和目標變形較大的情況下更為穩健,它可以自適應地調整窗口大小和方向,以適應目標的變化。
-
cv2.polylines
函數用于在圖像上繪制多邊形。以下是函數的一般形式和參數說明:
cv2.polylines(img, pts, isClosed, color, thickness[, lineType[, shift]])
-
img
: 要繪制多邊形的圖像。 -
pts
: 多邊形的頂點。這是一個包含數組的列表,每個數組表示一個頂點的坐標。 -
isClosed
: 一個布爾值,指示多邊形是否封閉。如果為True
,則多邊形將首尾相連形成封閉圖形。 -
color
: 多邊形的顏色,通常是一個表示顏色的元組,例如 (B, G, R)。 -
thickness
: 多邊形邊界的厚度。 -
lineType
(可選): 線條的類型,通常使用默認值cv2.LINE_8
。 -
shift
(可選): 像素坐標點的小數位數,通常使用默認值 0。
cv2.CamShift
是 OpenCV 中用于實現 CamShift(Continuous Adaptive Mean Shift)目標跟蹤算法的函數。CamShift 是 MeanShift 算法的一種擴展,能夠自適應地調整窗口的大小和方向,以適應目標的尺度和旋轉變化。
以下是 cv2.CamShift
函數的一般形式和參數說明:
retval, track_window = cv2.CamShift(probImage, window, criteria)
-
probImage
: 反向投影圖像,表示目標的概率分布。 -
window
: 初始搜索窗口的位置和大小,通常由之前的目標檢測或跟蹤給出。 -
criteria
: 定義迭代停止條件的元組(type, maxCount, epsilon)
。-
type
: 迭代停止類型,通常為cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT
。 -
maxCount
: 最大迭代次數。 -
epsilon
: 迭代停止的閾值。
-
-
retval
: 一個包含返回值的元組,其中包括追蹤目標的信息,如位置、大小和方向。 -
track_window
: 更新后的追蹤窗口。
cv2.meanShift
是 OpenCV 中用于實現 MeanShift 目標跟蹤算法的函數。MeanShift 是一種迭代的無參數方法,用于尋找圖像中的目標區域。該算法主要用于目標在靜止相機下的跟蹤。
以下是 cv2.meanShift
函數的一般形式和參數說明:
retval, track_window = cv2.meanShift(probImage, window, criteria)
-
probImage
: 反向投影圖像,表示目標的概率分布。 -
window
: 初始搜索窗口的位置和大小,通常由之前的目標檢測或跟蹤給出。 -
criteria
: 定義迭代停止條件的元組(type, maxCount, epsilon)
。-
type
: 迭代停止類型,通常為cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT
。 -
maxCount
: 最大迭代次數。 -
epsilon
: 迭代停止的閾值。
-
-
retval
: 一個包含返回值的元組,其中包括追蹤目標的信息,如位置和大小。 -
track_window
: 更新后的追蹤窗口。
在 OpenCV 中,可以使用 cv2.meanShift
函數進行 MeanShift 算法的目標跟蹤,以及 cv2.CamShift
函數進行 CamShift 算法的目標跟蹤。以下是一個簡單的示例,演示如何使用 CamShift 進行目標跟蹤:
import cv2
import numpy as np# 讀取視頻文件
cap = cv2.VideoCapture(r"C:\Users\mzd\Desktop\opencv\1.mp4")# 讀取第一幀
ret, frame = cap.read()# 定義追蹤窗口的初始位置
x, y, w, h = 300, 200, 100, 50
track_window = (x, y, w, h)# 提取追蹤窗口中的直方圖
roi = frame[y:y+h, x:x+w]
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, (0, 60, 32), (180, 255, 255))
roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180])
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)# 設置追蹤參數
term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)while True:ret, frame = cap.read()if not ret:break# 將當前幀轉換為 HSV 色彩空間hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)# 使用反向投影計算圖像中的目標位置dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)# 應用 CamShift 算法進行目標跟蹤ret, track_window = cv2.CamShift(dst, track_window, term_crit)# 繪制跟蹤窗口pts = cv2.boxPoints(ret)pts = np.int0(pts)img = cv2.polylines(frame, [pts], True, (0, 255, 0), 2)cv2.imshow('CamShift Tracking', img)if cv2.waitKey(30) & 0xFF == 27:breakcap.release()
cv2.destroyAllWindows()
在這個示例中,我們首先讀取視頻并提取第一幀,然后定義了追蹤窗口的初始位置。接著,我們從追蹤窗口中提取直方圖,并在每一幀中使用反向投影計算目標的位置,并應用 CamShift 算法進行目標跟蹤。最后,使用 OpenCV 的繪圖函數在圖像上繪制跟蹤窗口。