![]() |
OpenCV 4.12.0
開源計算機視覺
|
長期光學跟蹤是許多計算機視覺應用在現實世界場景中的一個重要問題。該領域的發展非常分散,此 API 提供了一個獨特的介面,可用於整合多種演算法並進行比較。這項工作部分基於 [235] 和 [166] 。
這些演算法從目標的邊界框開始,並透過其內部表示避免跟蹤過程中的漂移。這些長期跟蹤器能夠線上評估新幀中目標位置的質量,而無需真實值。
主要有三個元件:TrackerContribSampler、TrackerContribFeatureSet 和 TrackerModel。第一個元件是根據最後的目標位置計算幀上的影像塊的物件。TrackerContribFeatureSet 是管理特徵的類,可以整合多種型別(HAAR、HOG、LBP、Feature2D 等)。最後一個元件是目標的內部表示,它是外觀模型。它儲存所有狀態候選並計算軌跡(最可能的目標狀態)。類 TrackerTargetState 表示目標的一種可能狀態。TrackerContribSampler 和 TrackerContribFeatureSet 是目標的視覺表示,而 TrackerModel 則是統計模型。
這些演算法的近期基準測試可見於 [304]
如果您想建立一個新的跟蹤器,請按以下步驟操作。首先,確定跟蹤器類的名稱(為了符合現有風格,我們建議使用“tracker”字首,例如 trackerMIL、trackerBoosting)——後續我們將此選擇稱為“classname”。
每個跟蹤器都有三個元件:TrackerContribSampler、TrackerContribFeatureSet 和 TrackerModel。前兩個是從 Tracker 基類例項化的,而最後一個元件是抽象的,因此您必須實現自己的 TrackerModel。
TrackerContribSampler 已經例項化,但您應該定義取樣演算法並將類(或單個類)新增到 TrackerContribSampler。您可以選擇一個現成的實現,例如 TrackerContribSamplerCSC,或者您可以實現自己的取樣方法,在這種情況下,該類必須繼承 TrackerContribSamplerAlgorithm。填寫 samplingImpl 方法,將結果寫入“sample”輸出引數。
建立專門的 TrackerContribSamplerAlgorithm TrackerContribSamplerCSC 示例:
將 TrackerContribSamplerAlgorithm 新增到 TrackerContribSampler 的示例:
TrackerContribFeatureSet 已經例項化(作為第一個),但您應該定義在跟蹤器中將使用哪些型別的特徵。您可以使用多種特徵型別,因此您可以在 TrackerContribFeatureSet 中新增一個現成的實現,例如 TrackerContribFeatureHAAR,或者開發自己的實現。在這種情況下,在 computeImpl 方法中放置提取特徵的程式碼,並在 selection 方法中可選地放置用於特徵細化和選擇的程式碼。
建立專門的 TrackerFeature TrackerContribFeatureHAAR 示例:
將 TrackerFeature 新增到 TrackerContribFeatureSet 的示例:
TrackerModel 是抽象的,因此在您的實現中,您必須開發繼承自 TrackerModel 的 TrackerModel。填寫狀態估計方法“modelEstimationImpl”,它估計最可能的目標位置,更多資訊請參閱 [235] 表 I (ME)。填寫“modelUpdateImpl”以更新模型,請參閱 [235] 表 I (MU)。在此類中,您可以使用 :cConfidenceMap 和 :cTrajectory 來儲存模型。前者表示所有可能的候選狀態的模型,後者表示所有估計狀態的列表。
建立專門的 TrackerModel TrackerMILModel 示例:
並將其新增到您的 Tracker 中:
在最後一步,您應該根據您的實現定義 TrackerStateEstimator,或者您可以使用現成的類,例如 TrackerStateEstimatorMILBoosting。它代表模型的統計部分,用於估計最可能的目標狀態。
建立專門的 TrackerStateEstimator TrackerStateEstimatorMILBoosting 示例:
並將其新增到您的 TrackerModel 中:
在此步驟中,您應該根據您的實現定義 TrackerTargetState。TrackerTargetState 基類只包含邊界框(左上角位置、寬度和高度),您可以新增縮放因子、目標旋轉等來豐富它。
建立專門的 TrackerTargetState TrackerMILTargetState 示例:
名稱空間 | |
| 名稱空間 | cv::detail::tracking::contrib_feature |
| 名稱空間 | cv::detail::tracking::kalman_filters |
| 名稱空間 | cv::detail::tracking::online_boosting |
| 名稱空間 | cv::detail::tracking::tbm |
| 名稱空間 | 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 畫素的互動矩陣 ( [134] [54] [55] )。這通常用於視覺伺服應用中,以命令機器人移動到期望的畫素位置/速度。透過反轉此矩陣,可以估計相機的空間速度,即扭轉(twist)。 | |
| cv::Vec6d | cv::detail::tracking::computeTwist (const cv::Mat &uv, const cv::Mat &duv, const cv::Mat &depths, const cv::Mat &K) |
根據一組 2D 畫素位置、它們的速度、深度值和相機的內參來計算相機扭轉(twist)。畫素速度通常透過光流演算法獲得,密集流和稀疏流都可用於計算影像之間的光流,duv 透過將光流除以影像之間的時間間隔來計算。 | |
| typedef std::vector<std::pair<Ptr<TrackerTargetState>, float> > cv::detail::tracking::ConfidenceMap |
#include <opencv2/video/detail/tracking.detail.hpp>
表示幀 \(k\) 處的目標模型(所有狀態和分數)
參見 [235] 對 \(\langle \hat{x}^{i}_{k}, C^{i}_{k} \rangle\) 的集合
| 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 & | 輸入的相機內參矩陣。, | ||
| cv::Mat & | J ) |
#include <opencv2/tracking/twist.hpp>
計算一組 2D 畫素的互動矩陣 ( [134] [54] [55] )。這通常用於視覺伺服應用中,以命令機器人移動到期望的畫素位置/速度。透過反轉此矩陣,可以估計相機的空間速度,即扭轉(twist)。
| uv | 2xN 2D 畫素位置矩陣 |
| depths | 1xN 深度值矩陣 |
| 輸入的相機內參矩陣。 | 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 畫素位置、它們的速度、深度值和相機的內參來計算相機扭轉(twist)。畫素速度通常透過光流演算法獲得,密集流和稀疏流都可用於計算影像之間的光流,duv 透過將光流除以影像之間的時間間隔來計算。
| uv | 2xN 2D 畫素位置矩陣 |
| duv | 2Nx1 2D 畫素速度矩陣 |
| depths | 1xN 深度值矩陣 |
| 輸入的相機內參矩陣。 | 3x3 相機內參矩陣 |