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)
- 檔案名稱:
MobileNetSSD_deploy.prototxtMobileNetSSD_deploy.caffemodel
- 下載來源:
- 使用方式:
1
net = cv2.dnn.readNetFromCaffe("MobileNetSSD_deploy.prototxt", "MobileNetSSD_deploy.caffemodel")
💡 下載後的檔案名稱可能不一致,可以自行重新命名即可。
🧠 函式與參數說明
📌 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 | import cv2 |

圖:圖片物件分類與定位,框選並標記物件類別
💻 範例程式 — 影片物件分類與定位
1 | import cv2 |

圖:影片物件分類與定位,逐幀框選並標記物件類別
⚠️ 注意事項
- 模型檔案需先下載並放在專案目錄。
- 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 — 免費影片素材
