Like Share Discussion Bookmark Smile

J.J. Huang   2026-02-28   Python OpenCV 07.物件偵測與辨識篇   瀏覽次數:次   DMCA.com Protection Status

Python | OpenCV 物件分類與定位

📚 前言

在前一篇我們學會了 人臉偵測與追蹤
這一篇要進一步介紹 物件分類與定位 (Object Classification & Localization)
分類是判斷「這是什麼物件」,定位則是標記「它在哪裡」。這是進入多物件偵測與追蹤之前的重要基礎。

🎨 範例圖片/影片

這裡我們使用 Pexels 提供的免費圖片素材:Street Image
下載後將檔名改為 street.jpg,在程式碼範例中使用。這張圖片中有車輛與行人,非常適合用來測試物件分類與定位。

這裡我們使用 Pexels 提供的免費影片素材:Street Video
下載後將檔名改為 street.mp4,在程式碼範例中使用。影片中有車輛與行人,非常適合用來測試物件分類與定位。

🔎 原理說明

  • 分類 (Classification):利用 CNN/DNN 模型判斷物件的類別,例如「人」、「車」、「狗」。
  • 定位 (Localization):輸出邊界框座標 (x, y, w, h),標記物件位置。
  • OpenCV DNN 模組:支援 Caffe、TensorFlow、ONNX 等模型,可用於物件分類與定位。

📂 模型下載與使用說明

MobileNet SSD (Caffe)

💡 下載後的檔案名稱可能不一致,可以自行重新命名即可。

🧠 函式與參數說明

📌 cv2.dnn.readNetFromCaffe()

載入 Caffe 模型

1
net = cv2.dnn.readNetFromCaffe(prototxt, model)
  • prototxt:模型結構檔案。
  • model:訓練好的權重檔案。

📌 cv2.dnn.blobFromImage()

將圖片轉換成 DNN 輸入格式

1
blob = cv2.dnn.blobFromImage(image, scalefactor, size, mean, swapRB, crop)
  • image:輸入圖片。
  • scalefactor:縮放比例,常用 0.007843
  • size:輸入大小 (width, height),例如 (300, 300)
  • mean:減去的平均值,常用 (127.5, 127.5, 127.5)
  • swapRB:是否交換 R 與 B 通道,常用 False
  • crop:是否裁切圖片,常用 False

💻 範例程式 — 圖片物件分類與定位

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
import cv2

net = cv2.dnn.readNetFromCaffe("models/MobileNetSSD_deploy.prototxt", "models/MobileNetSSD_deploy.caffemodel")

CLASSES = ["background", "aeroplane", "bicycle", "bird", "boat",
"bottle", "bus", "car", "cat", "chair", "cow", "diningtable",
"dog", "horse", "motorbike", "person", "pottedplant",
"sheep", "sofa", "train", "tvmonitor"]

img = cv2.imread("street.jpg")
(h, w) = img.shape[:2]
blob = cv2.dnn.blobFromImage(cv2.resize(img, (300, 300)), 0.007843, (300, 300), 127.5)

net.setInput(blob)
detections = net.forward()

for i in range(detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence > 0.5:
idx = int(detections[0, 0, i, 1])
box = detections[0, 0, i, 3:7] * [w, h, w, h]
(x1, y1, x2, y2) = box.astype("int")
label = CLASSES[idx]
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(img, label, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2)

cv2.imshow("Object Classification & Localization", img)
cv2.waitKey(0)
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
import cv2

net = cv2.dnn.readNetFromCaffe("models/MobileNetSSD_deploy.prototxt", "models/MobileNetSSD_deploy.caffemodel")

CLASSES = ["background", "aeroplane", "bicycle", "bird", "boat",
"bottle", "bus", "car", "cat", "chair", "cow", "diningtable",
"dog", "horse", "motorbike", "person", "pottedplant",
"sheep", "sofa", "train", "tvmonitor"]

cap = cv2.VideoCapture("street.mp4")

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

(h, w) = frame.shape[:2]
blob = cv2.dnn.blobFromImage(cv2.resize(frame, (300, 300)), 0.007843, (300, 300), 127.5)

net.setInput(blob)
detections = net.forward()

for i in range(detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence > 0.5:
idx = int(detections[0, 0, i, 1])
box = detections[0, 0, i, 3:7] * [w, h, w, h]
(x1, y1, x2, y2) = box.astype("int")
label = CLASSES[idx]
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(frame, label, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2)

cv2.imshow("Video Object Classification & Localization", frame)

if cv2.waitKey(30) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()


圖:影片物件分類與定位,逐幀框選並標記物件類別

⚠️ 注意事項

  • 模型檔案需先下載並放在專案目錄。
  • MobileNet SSD 適合即時應用,但準確度有限。
  • 若需要更高準確度,可以使用 YOLO 或 Faster R-CNN。
  • 偵測速度與準確度會因模型不同而有差異。

📊 應用場景

  • 自駕車:辨識道路上的車輛與行人。
  • 監控系統:即時分類並定位可疑物件。
  • 智慧零售:辨識商品種類與位置。
  • 互動遊戲:追蹤玩家與物件位置。

🎯 結語

本篇我們學會了如何使用 OpenCV 物件分類與定位,透過 DNN 模型在圖片與影片中辨識物件並標記位置。
這是進入 多物件偵測與追蹤 的重要基礎,因為只有先理解「分類」與「定位」的概念,才能進一步處理多個物件的同時偵測與持續追蹤。

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

註:以上參考了
OpenCV 官方文件 — Tutorials
OpenCV 官方文件 — Python Tutorials
OpenCV GitHub — Haar Cascades
OpenCV GitHub — LBP Cascades
OpenCV GitHub — DNN Face Detector (deploy.prototxt)
GitHub — MobileNetSSD 模型
Pexels — 免費影片素材