![]() |
OpenCV 4.13.0
Open Source Computer Vision
|
長期オプティカルトラッキングは、実世界のシナリオにおける多くのコンピュータビジョンアプリケーションにとって重要な課題である。この分野の開発は非常に断片化しており、このAPIは複数のアルゴリズムを組み込んで比較するのに有用な統一インターフェースである。この成果は一部 [238] および [169] に基づいている。
これらのアルゴリズムは対象のバウンディングボックスから開始し、内部表現によってトラッキング中のドリフトを回避する。これらの長期トラッカーは、グラウンドトゥルースなしで新しいフレーム内の対象位置の品質をオンラインで評価できる。
主要なコンポーネントは3つある:TrackerContribSampler、TrackerContribFeatureSet、そして TrackerModel である。最初のコンポーネントは、直前の対象位置に基づいてフレーム上のパッチを計算するオブジェクトである。TrackerContribFeatureSet は特徴を管理するクラスであり、多くの種類(HAAR、HOG、LBP、Feature2D など)を組み込むことができる。最後のコンポーネントは対象の内部表現であり、外観モデルである。これはすべての状態候補を格納し、軌跡(最も可能性の高い対象状態)を計算する。クラス TrackerTargetState は対象の取りうる状態を表す。TrackerContribSampler と TrackerContribFeatureSet は対象の視覚的表現であり、一方 TrackerModel は統計的モデルである。
これらのアルゴリズム間の最近のベンチマークは [307] に記載されている
新しいトラッカーを作成したい場合、何をすべきかを示す。まず、トラッカーのクラス名を決める(既存のスタイルに合わせるため、接頭辞「tracker」を付けたもの、例えば trackerMIL、trackerBoosting を推奨する)。以降ではこの選択を「classname」と呼ぶ。
すべてのトラッカーは3つのコンポーネント TrackerContribSampler、TrackerContribFeatureSet、TrackerModel を持つ。最初の2つは Tracker 基底クラスからインスタンス化されるが、最後のコンポーネントは抽象であるため、独自の TrackerModel を実装しなければならない。
TrackerContribSampler はすでにインスタンス化されているが、サンプリングアルゴリズムを定義し、クラス(または単一のクラス)を TrackerContribSampler に追加すべきである。TrackerContribSamplerCSC のような既成の実装の1つを選ぶこともできるし、独自のサンプリング手法を実装することもできる。後者の場合、クラスは TrackerContribSamplerAlgorithm を継承しなければならない。結果を「sample」出力引数に書き込む samplingImpl メソッドを実装する。
特化した TrackerContribSamplerAlgorithm TrackerContribSamplerCSC を作成する例::
TrackerContribSamplerAlgorithm を TrackerContribSampler に追加する例::
TrackerContribFeatureSet はすでに(最初に)インスタンス化されているが、トラッカーで使用する特徴の種類を定義すべきである。複数の特徴の種類を使用できるため、TrackerContribFeatureHAAR のような既成の実装を TrackerContribFeatureSet に追加するか、独自の実装を開発できる。この場合、computeImpl メソッドに特徴を抽出するコードを記述し、selection メソッドに必要に応じて特徴の絞り込みと選択を行うコードを記述する。
特化した TrackerFeature TrackerContribFeatureHAAR を作成する例::
TrackerFeature を TrackerContribFeatureSet に追加する例::
TrackerModel は抽象であるため、実装では TrackerModel を継承する独自の TrackerModel を開発しなければならない。状態を推定するメソッド「modelEstimationImpl」を実装する。これは最も可能性の高い対象位置を推定する。詳細は [238] の表 I (ME) を参照。モデルを更新するために「modelUpdateImpl」を実装する。[238] の表 I (MU) を参照。このクラスでは :cConfidenceMap と :cTrajectory を使ってモデルを格納できる。前者はすべての取りうる候補状態に対するモデルを表し、後者はすべての推定状態のリストを表す。
特化した TrackerModel TrackerMILModel を作成する例::
そしてそれを Tracker に追加する::
最後のステップでは、実装に基づいて TrackerStateEstimator を定義するか、TrackerStateEstimatorMILBoosting のような既成のクラスの1つを使用できる。これは最も可能性の高い対象状態を推定するモデルの統計的部分を表す。
特化した TrackerStateEstimator TrackerStateEstimatorMILBoosting を作成する例::
そしてそれを TrackerModel に追加する::
このステップでは、実装に基づいて独自の TrackerTargetState を定義すべきである。TrackerTargetState 基底クラスはバウンディングボックス(左上の位置、幅、高さ)のみを持つが、スケール係数や対象の回転などを追加して拡張できる。
特化した TrackerTargetState TrackerMILTargetState を作成する例::
名前空間 | |
| namespace | cv::detail::tracking::contrib_feature |
| namespace | cv::detail::tracking::kalman_filters |
| namespace | cv::detail::tracking::online_boosting |
| namespace | cv::detail::tracking::tbm |
| namespace | cv::detail::tracking::tld |
型定義 | |
| typedef std::vector< std::pair< Ptr< TrackerTargetState >, float > > | cv::detail::tracking::ConfidenceMap |
| フレーム \(k\) における対象のモデル(すべての状態とスコア)を表す | |
| typedef std::vector< Ptr< TrackerTargetState > > | cv::detail::tracking::Trajectory |
| すべてのフレームの推定状態を表す。 | |
関数 | |
| void | cv::detail::tracking::computeInteractionMatrix (const cv::Mat &uv, const cv::Mat &depths, const cv::Mat &K, cv::Mat &J) |
| 2D ピクセルの集合に対する相互作用行列 ( [136] [55] [56] ) を計算する。これは通常、ビジュアルサーボイングのアプリケーションでロボットに対し、目的のピクセル位置/速度で移動するよう指令するために使用される。この行列を反転させることで、カメラの空間速度すなわちツイストを推定できる。 | |
| cv::Vec6d | cv::detail::tracking::computeTwist (const cv::Mat &uv, const cv::Mat &duv, const cv::Mat &depths, const cv::Mat &K) |
2D ピクセル位置の集合、それらの速度、深度値、およびカメラの内部パラメータからカメラのツイストを計算する。ピクセル速度は通常、オプティカルフローアルゴリズムから得られる。画像間のフローの計算には密なフローと疎なフローの両方が使用でき、duv はフローを画像間の時間間隔で割ることで計算される。 | |
| typedef std::vector<std::pair<Ptr<TrackerTargetState>, float> > cv::detail::tracking::ConfidenceMap |
#include <opencv2/video/detail/tracking.detail.hpp>
フレーム \(k\) における対象のモデル(すべての状態とスコア)を表す
[238] を参照。ペア \(\langle \hat{x}^{i}_{k}, C^{i}_{k} \rangle\) の集合
| typedef std::vector<Ptr<TrackerTargetState> > cv::detail::tracking::Trajectory |
#include <opencv2/video/detail/tracking.detail.hpp>
すべてのフレームの推定状態を表す。
[238] \(x_{k}\) は時刻 \(k\) までの対象の軌跡である
| void cv::detail::tracking::computeInteractionMatrix | ( | const cv::Mat & | uv, |
| const cv::Mat & | depths, | ||
| const cv::Mat & | K, | ||
| cv::Mat & | J ) |
#include <opencv2/tracking/twist.hpp>
2D ピクセルの集合に対する相互作用行列( [136] [55] [56] )を計算する。これは通常、ビジュアルサーボイングのアプリケーションで、ロボットに目的のピクセル位置/速度へ移動するよう指令するために使用される。この行列を逆変換することで、カメラの空間速度すなわちツイストを推定できる。
| uv | 2D ピクセル位置の 2xN 行列 |
| depths | 深度値の 1xN 行列 |
| K | 3x3 のカメラ内部パラメータ行列 |
| J | 2Nx6 の相互作用行列 |
| cv::Vec6d cv::detail::tracking::computeTwist | ( | const cv::Mat & | uv, |
| const cv::Mat & | duv, | ||
| const cv::Mat & | depths, | ||
| const cv::Mat & | K ) |
#include <opencv2/tracking/twist.hpp>
2D ピクセル位置の集合、その速度、深度値、およびカメラの内部パラメータからカメラのツイストを計算する。ピクセル速度は通常オプティカルフローアルゴリズムから得られ、画像間のフローの計算には密フローと疎フローのどちらも使用でき、duv はフローを画像間の時間間隔で割ることで計算される。
| uv | 2D ピクセル位置の 2xN 行列 |
| duv | 2D ピクセル速度の 2Nx1 行列 |
| depths | 深度値の 1xN 行列 |
| K | 3x3 のカメラ内部パラメータ行列 |