OpenCV 4.11.0
开源计算机视觉
|
长期光学跟踪是许多现实世界计算机视觉应用中的一个重要问题。该领域的进展非常分散,而此API是一个独特的接口,可用于插入多个算法并进行比较。这项工作部分基于[232]和[163]。
这些算法从目标的边界框开始,并通过其内部表示来避免跟踪过程中的漂移。这些长期跟踪器能够在线评估新帧中目标位置的质量,无需地面实况。
主要有三个组成部分:TrackerContribSampler、TrackerContribFeatureSet和TrackerModel。第一个组件是根据目标的最后位置计算帧上补丁的对象。TrackerContribFeatureSet是管理特征的类,可以插入许多类型的特征(HAAR、HOG、LBP、Feature2D等)。最后一个组件是目标的内部表示,即外观模型。它存储所有状态候选并计算轨迹(最可能的目标状态)。类TrackerTargetState表示目标的可能状态。TrackerContribSampler和TrackerContribFeatureSet是目标的视觉表示,而TrackerModel是统计模型。
这些算法之间最近的基准测试可以在[302]中找到。
如果你想创建一个新的跟踪器,你需要这样做。首先,决定跟踪器的类名(为了符合现有风格,我们建议使用“tracker”前缀,例如trackerMIL、trackerBoosting)——我们将在后续中将其称为“classname”。
每个跟踪器都有三个组件TrackerContribSampler、TrackerContribFeatureSet和TrackerModel。前两个是从Tracker基类实例化的,而最后一个组件是抽象的,因此你必须实现你的TrackerModel。
TrackerContribSampler已经实例化,但是你应该定义采样算法并将类(或单个类)添加到TrackerContribSampler。你可以选择现成的实现,例如TrackerContribSamplerCSC,或者你可以实现你自己的采样方法,在这种情况下,该类必须继承TrackerContribSamplerAlgorithm。填充samplingImpl方法,该方法将结果写入“sample”输出参数。
创建专用TrackerContribSamplerAlgorithm TrackerContribSamplerCSC 的示例:
将TrackerContribSamplerAlgorithm添加到TrackerContribSampler的示例:
TrackerContribFeatureSet 已经实例化(作为第一个),但是您应该定义跟踪器中将使用哪种类型的特征。您可以使用多种特征类型,因此可以将现成的实现添加为TrackerContribFeatureHAAR 到您的 TrackerContribFeatureSet 中,或者开发您自己的实现。在这种情况下,在 computeImpl 方法中放置提取特征的代码,并在 selection 方法中可选地放置用于特征细化和选择的代码。
创建专用TrackerFeature TrackerContribFeatureHAAR 的示例:
将TrackerFeature添加到TrackerContribFeatureSet的示例:
TrackerModel 是抽象的,因此在您的实现中,您必须开发继承自TrackerModel 的TrackerModel。填写状态估计方法“modelEstimationImpl”,该方法估计最可能的目标位置,请参见[232] 表 I (ME) 获取更多信息。填写“modelUpdateImpl”以更新模型,请参见[232] 表 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) |
计算一组二维像素的交互矩阵([131] [52] [53])。这通常用于视觉伺服应用中,以命令机器人移动到所需的像素位置/速度。通过反转该矩阵,可以估计摄像机的空间速度,即旋转。 | |
cv::Vec6d | cv::detail::tracking::computeTwist (const cv::Mat &uv, const cv::Mat &duv, const cv::Mat &depths, const cv::Mat &K) |
根据一组二维像素位置、其速度、深度值和摄像机的内参来计算摄像机的旋转。像素速度通常由光流算法获得,密集流和稀疏流都可以用来计算图像之间的流,并通过将流除以图像之间的时间间隔来计算duv 。 | |
typedef std::vector<std::pair<Ptr<TrackerTargetState>, float> > cv::detail::tracking::ConfidenceMap |
#include <opencv2/video/detail/tracking.detail.hpp>
表示目标在第 \(k\) 帧的模型(所有状态和分数)
参见 [232] \(\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 & | K, | ||
cv::Mat & | J ) |
#include <opencv2/tracking/twist.hpp>
计算一组二维像素的交互矩阵([131] [52] [53])。这通常用于视觉伺服应用中,以命令机器人移动到所需的像素位置/速度。通过反转该矩阵,可以估计摄像机的空间速度,即旋转。
uv | 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>
根据一组二维像素位置、其速度、深度值和摄像机的内参来计算摄像机的旋转。像素速度通常由光流算法获得,密集流和稀疏流都可以用来计算图像之间的流,并通过将流除以图像之间的时间间隔来计算duv
。
uv | 2xN 矩阵,表示二维像素位置 |
duv | 2Nx1 矩阵,表示二维像素速度 |
depths | 1xN 矩阵,表示深度值 |
K | 3x3 摄像机内参矩阵 |