使用 OpenCV 進行物件跟蹤

Manav Narula 2023年1月30日
  1. OpenCV 中用於物件跟蹤的跟蹤器
  2. 在 Python 中使用 OpenCV 物件跟蹤器
  3. まとめ
使用 OpenCV 進行物件跟蹤

物件跟蹤是計算機視覺中的重要任務之一,具有許多實際應用。在物件跟蹤中,我們嘗試根據一些給定的引數來區分不同的物件並跟蹤它們的運動。

請記住,物件跟蹤與物件檢測不同。這是因為物件跟蹤要快得多,因為我們不傾向於在每一幀中檢測物件,這增加了計算量。

物件跟蹤在現實生活中最常見的應用是跟蹤車輛在道路上的運動。我們可以通過跟蹤它們的軌跡來識別不同的車輛並觀察它們是否遵守道路規則。

我們可以使用 opencv 庫來處理 Python 中的物件跟蹤問題。本教程將討論 opencv 中用於物件跟蹤的不同跟蹤器。

OpenCV 中用於物件跟蹤的跟蹤器

第一個跟蹤器是基於機器學習的 AdaBoost 演算法的 cv2.TrackerBoosting_create。它在執行時使用要跟蹤的物件的正負樣本進行學習,並且它最近沒有很好的跟蹤記錄,被認為很慢。

然後,我們有了基於 MIL 演算法的 cv2.TrackerMIL_create 跟蹤器。它是作為對 BOOSTING 跟蹤器的改進而構建的,它基於正樣本附近的類似概念和因素來區分物件,從而提高整體準確性。

cv2.TrackerKCF_create 跟蹤器基於對 MIL 中多個正匹配的重疊區域的數學方法。KCF 的完整形式是 Kernelized Correlation Filters,它被認為是一個不錯的跟蹤器,在跟蹤單個物件時效果很好。

cv2.TrackerCSRT_create 跟蹤器基於具有通道和空間可靠性的判別相關濾波器。它使用有助於選擇所需物件的空間可靠性圖過濾掉部分幀,並且對於較低的幀速率,它提供了響亮的高精度。

cv2.TrackerMedianFlow_create 跟蹤器是一種高階跟蹤器,旨在最大限度地減少跟蹤失敗並選擇最可靠的路徑。實時檢測物件,計算其向前和向後運動的位移,並比較兩個值之間的誤差和差異的測量值,以跟蹤給定物件的軌跡。

我們還有 cv2.TrackerTLD_create 跟蹤器。TLD 代表跟蹤、學習和檢測,它逐幀跟蹤物件的軌跡。它使用前一幀的位置來糾正和改進跟蹤。

如果需要,檢測器部分用於使用前一幀校正跟蹤器。它非常有效地處理物件重疊。

cv2.TrackerMOSSE_create 跟蹤器,其中 MOSSE 代表平方誤差的最小輸出和,使用傅立葉空間中的自適應相關性來跟蹤物件。它使用這些相關值並嘗試最小化實際相關性和預測相關性之間的平方誤差之和。

該跟蹤器具有很高的跟蹤速度,可以很好地適應光線和物體周圍環境的變化。

在 Python 中使用 OpenCV 物件跟蹤器

我們將在示例中使用 cv2.TrackerKCF_create 跟蹤器來跟蹤物件。我們將從使用 capture() 函式讀取示例視訊開始。

然後,我們初始化一個跟蹤物件的變數。最初,它被指定為 none 並執行一個迴圈,逐幀讀取此視訊。

最初,我們檢查在前一幀中是否進行了跟蹤,如果初始化變數不是 none,則繼續進行。如果沒有,我們使用 selectROI 功能選擇我們想要跟蹤的物件。

之後,我們使用定義的跟蹤器物件在每一幀中跟蹤這個物件並顯示跟蹤資訊。

程式碼示例:

import cv2
import imutils

vid = cv2.VideoCapture("sample1.mp4")
initial_box = None
tracker = cv2.TrackerKCF_create()
while True:
    fr = vid.read()
    if fr is None:
        break
    if initial_box is not None:
        (success, box) = tracker.update(fr)
        if success:
            (x, y, w, h) = [int(v) for v in box]
            cv2.rectangle(fr, (x, y), (x + w, y + h), (0, 255, 0), 2)
        fps.update()
        fps.stop()
        information = [
            ("Success", "Yes" if success else "No"),
            ("FPS", "{:.3f}".format(fps.fps())),
        ]
        for (i, (k, v)) in enumerate(information):
            text = "{}: {}".format(k, v)
            cv2.putText(
                fr,
                text,
                (10, H - ((i * 20) + 20)),
                cv2.FONT_HERSHEY_SIMPLEX,
                0.6,
                (0, 0, 255),
                2,
            )
        cv2.imshow("Output Frame", fr)
        key = cv2.waitKey(1) & 0xFF
    initial_box = cv2.selectROI("fr", fr, fromCenter=False, showCrosshair=True)
    tracker.init(fr, initial_box)
    fps = FPS().start()

cv2.destroyAllWindows()

まとめ

我們討論了 opencv 庫中用於物件跟蹤的不同演算法。首先,我們討論了物件跟蹤及其在現實生活中的用途。

然後,我們詳細討論了 opencv 庫的八個可用跟蹤器以及使用這些跟蹤器處理物件跟蹤的示例程式碼。

作者: Manav Narula
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn

相關文章 - Python OpenCV