📢 公告:OpenCV 系列文章目前正在重構整理中(進度約 65%),部分文章已暫時下架,後續會陸續補上,完成時間待定。感謝耐心等候!

Like Share Discussion Bookmark Smile

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

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

📚 前言

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

🎨 範例影片

  • 來源:Pexels - Tennis Video,屬於無版權影片,可自由下載與使用。
  • 內容:影片呈現一個小孩打擊網球的畫面,長度約 3 秒,畫面中有明顯的移動物件,非常適合用來測試追蹤演算法。
  • 下載後將檔名改為 tennis.mp4,放到專案的 assets/ 目錄下。

🔎 原理說明

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

🧠 追蹤演算法比較

OpenCV 4.10+ 重整了追蹤器 API,舊版 KCF、CSRT、MOSSE 等已完全移除。目前可用的追蹤器如下:

演算法 需要模型檔 精準度 說明
MIL 不需模型,適合快速測試
GOTURN 需下載 caffemodel 模型
DaSiamRPN 需下載 onnx 模型
Nano 輕量級深度學習模型
VIT 最高 Vision Transformer,精準但較慢

建立追蹤器的語法(需安裝 opencv-contrib-python):

1
2
3
tracker = cv2.TrackerMIL_create()         # 不需模型,推薦用於測試
tracker = cv2.TrackerGOTURN_create() # 需模型檔
tracker = cv2.TrackerDaSiamRPN_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
48
# tracking_camera.py
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")

# 建立追蹤器 (MIL 不需要模型檔,適合快速測試)
tracker = cv2.TrackerMIL_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
44
# tracking_video.py
import cv2

# 讀取範例影片
cap = cv2.VideoCapture("assets/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")

# 建立追蹤器 (MIL 不需要模型檔,適合快速測試)
tracker = cv2.TrackerMIL_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 — 免費影片素材