OpenCV を使用したオブジェクト追跡
オブジェクトの追跡は、多くの実際のアプリケーションがある ComputerVision の重要なタスクの 1つです。オブジェクト追跡では、特定のパラメータに基づいてさまざまなオブジェクトを区別し、それらの動きを追跡しようとします。
オブジェクトの追跡はオブジェクトの検出とは異なることに注意してください。これは、すべてのフレームでオブジェクトを検出する傾向がないため、オブジェクトの追跡がはるかに高速であり、計算負荷が高くなるためです。
オブジェクト追跡の最も一般的な実際のアプリケーションは、道路上の車両の動きを追跡することです。さまざまな車両を識別し、それらの軌道を追跡することで、それらが道路の規則に従っているかどうかを観察できます。
opencv
ライブラリを使用して、Python でのオブジェクト追跡の問題を処理できます。このチュートリアルでは、オブジェクト追跡用に opencv
で使用できるさまざまなトラッカーについて説明します。
OpenCV でのオブジェクト追跡用のトラッカー
最初のトラッカーは、機械学習の AdaBoost アルゴリズムに基づく cv2.TrackerBoosting_create
です。実行時に追跡されるオブジェクトのポジティブサンプルとネガティブサンプルを使用して学習しますが、最近は良好な実績がなく、非常に遅いと見なされています。
次に、MIL アルゴリズムに基づく cv2.TrackerMIL_create
トラッカーがあります。これは、BOOSTING トラッカーの改善として構築され、オブジェクトを区別して全体的な精度を向上させるために、ポジティブサンプルの近くにある同様の概念と要因に基づいています。
cv2.TrackerKCF_create
トラッカーは、MIL 内の複数の正の一致の重複領域への数学的アプローチに基づいています。KCF の完全な形式は、カーネル化された相関フィルターであり、適切なトラッカーと見なされ、単一のオブジェクトの追跡に非常に適しています。
cv2.TrackerCSRT_create
トラッカーは、チャネルと空間の信頼性を備えた識別相関フィルターに基づいています。必要なオブジェクトを選択するのに役立つ空間信頼性マップを使用してフレームの一部を除外し、フレームレートを低くすると、非常に高い精度が得られます。
cv2.TrackerMedianFlow_create
トラッカーは、追跡の失敗を最小限に抑え、最も信頼性の高いパスを選択することを目的とした高度なトラッカーです。オブジェクトがリアルタイムで検出され、前進運動と後退運動の変位が計算され、2つの値の誤差と差の測定値が比較されて、特定のオブジェクトの軌道が追跡されます。
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
ライブラリで使用可能な 8つのトラッカーと、これらのトラッカーを使用したオブジェクト追跡の処理に関するサンプルコードについて詳しく説明しました。
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