🎉 春節公告:作者休息中,文章暫停更新。祝大家新年快樂,闔家平安!🧧

📅 預計於 2/23 繼續更新

Like Share Discussion Bookmark Smile

J.J. Huang   2026-02-13   Python OpenCV 06.視訊與互動篇   瀏覽次數:次   DMCA.com Protection Status

Python | OpenCV 即時圖片中的物件追蹤

📚 前言

在前一篇我們學會了 視訊檔案處理與剪輯
這一篇要介紹如何使用 OpenCV 即時圖片中的物件追蹤
物件追蹤是電腦視覺的重要應用之一,常用於監控、運動分析、互動系統等場景。
除了攝影機,我們也可以用影片檔來模擬,方便測試追蹤效果。

🎨 範例影片

這裡我們使用 Pexels 提供的免費影片素材:Tennis Video
下載後將檔名改為 tennis.mp4,在程式碼範例中使用。這段影片中有明顯的移動物件,非常適合用來測試追蹤演算法。

🔎 原理說明

  • 物件追蹤 (Object Tracking):在影片或即時圖片中,持續追蹤某個選定的目標。
  • 流程
    1. 讀取來源 (攝影機 / 影片檔 / 網路串流)。
    2. 選定要追蹤的物件區域 (ROI)。
    3. 建立追蹤器 (Tracker)。
    4. 在迴圈中更新追蹤結果,並顯示。

🧠 八種追蹤演算法比較

OpenCV 提供了八種追蹤器,各有速度與精準度上的差異:

演算法 速度 精準度 說明
BOOSTING 最早期的追蹤器,速度慢且不精準
MIL 比 BOOSTING 稍好,但仍不精準
GOTURN 需搭配深度學習模型才能運作
TLD 速度與精準度一般
MEDIANFLOW 對快速移動或跳動物件不準確
KCF 常用追蹤器,速度快但遮擋時不準
MOSSE 最快 速度最快,精準度略低於 KCF/CSRT
CSRT 最高 精準度最佳,但速度比 KCF 慢

建立追蹤器的語法 (新版 OpenCV 需使用 cv2.legacy):

1
2
3
tracker = cv2.legacy.TrackerKCF_create()      # KCF
tracker = cv2.legacy.TrackerCSRT_create() # CSRT
tracker = cv2.legacy.TrackerMOSSE_create() # MOSSE

⚠️ 常見問題與解決方式

在新版 OpenCV (4.x) 中,如果直接使用 cv2.TrackerKCF_create() 會出現以下錯誤:

1
AttributeError: module 'cv2' has no attribute 'TrackerKCF_create'

解決方式:

  1. 安裝 opencv-contrib-python 套件,因為追蹤器屬於 contrib 模組:
    1
    pip install opencv-contrib-python
  2. 使用新版 API:
    1
    tracker = cv2.legacy.TrackerKCF_create()

這樣就能正常執行物件追蹤範例。

💻 範例程式 — 即時攝影機物件追蹤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import cv2

# 建立攝影機物件 (0 = 預設攝影機)
cap = cv2.VideoCapture(0)

# 讀取第一幀,作為選擇追蹤區域的基準
ret, frame = cap.read()
if not ret:
print("無法讀取攝影機")
cap.release()
exit()

# 使用滑鼠選擇 ROI (欲追蹤的物件區域)
roi = cv2.selectROI("Select Object", frame, False)
cv2.destroyWindow("Select Object")

# 建立追蹤器 (這裡使用 CSRT,可改成 KCF 或 MOSSE)
tracker = cv2.legacy.TrackerCSRT_create()
tracker.init(frame, roi)

while True:
# 逐幀讀取攝影機影像
ret, frame = cap.read()
if not ret:
break

# 更新追蹤器狀態
success, box = tracker.update(frame)

if success:
# 追蹤成功,繪製矩形框出物件
x, y, w, h = [int(v) for v in box]
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
else:
# 追蹤失敗,顯示提示文字
cv2.putText(frame, "Lost", (50, 50),
cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0,0,255), 2)

# 顯示結果影像
cv2.imshow("Tracking", frame)

# 按下 q 鍵退出
if cv2.waitKey(30) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()


圖:即時追蹤選定的物件

註:由於本身沒有攝影鏡頭,所以無法示範效果。

💻 範例程式 — 使用影片檔進行物件追蹤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import cv2

# 讀取範例影片 (檔名改為 tennis.mp4)
cap = cv2.VideoCapture("tennis.mp4")

# 讀取第一幀,作為選擇追蹤區域的基準
ret, frame = cap.read()
if not ret:
print("無法讀取影片")
cap.release()
exit()

# 使用滑鼠選擇 ROI (欲追蹤的物件區域)
roi = cv2.selectROI("Select Object", frame, False)
cv2.destroyWindow("Select Object")

# 建立追蹤器 (這裡使用 KCF,可改成 CSRT 或 MOSSE)
tracker = cv2.legacy.TrackerKCF_create()
tracker.init(frame, roi)

while True:
# 逐幀讀取影片
ret, frame = cap.read()
if not ret:
break

# 更新追蹤器狀態
success, box = tracker.update(frame)

if success:
# 追蹤成功,繪製矩形框出物件
x, y, w, h = [int(v) for v in box]
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)

# 顯示結果影像
cv2.imshow("Tracking", frame)

# 按下 q 鍵退出
if cv2.waitKey(30) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()


圖:在影片檔中追蹤選定的物件

⚠️ 注意事項

  • 追蹤器需要先選定 ROI,建議在第一幀選擇。
  • 不同演算法有不同特性,需依場景選擇。
  • 若物件消失或被遮擋,追蹤器可能失敗。
  • 測試時可使用交通影片或運動影片,物件移動明顯,追蹤效果更佳。

📊 應用場景

  • 監控系統:追蹤特定人物或車輛。
  • 運動分析:追蹤球員或球的移動。
  • 互動應用:即時追蹤手勢或物件。
  • 自動化系統:追蹤工業流程中的物件。

🎯 結語

本篇我們學會了如何使用 OpenCV 即時圖片中的物件追蹤,並透過不同演算法持續追蹤選定的目標。
同時也解決了新版 OpenCV 中常見的錯誤,確保程式能在最新環境下正常執行。
除了攝影機,也能用影片檔來測試,方便在沒有攝影機的環境下練習。
這些技術在監控、運動分析與互動應用中非常常見,後續可以結合人臉偵測或特徵匹配,打造更完整的系統。

📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。

註:以上參考了
OpenCV Tutorials
OpenCV-Python Tutorials
Pexels — 免費影片素材