![]() |
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 相机内参矩阵 |