OpenCV 4.10.0
开源计算机视觉
|
长期光学跟踪对于真实世界场景中的许多计算机视觉应用程序来说都是一个重要问题。此领域的发展非常分散,而此 API 是一个独特的接口,可用于插入多个算法并对它们进行比较。这项工作部分基于 [231] 和 [163])。
这些算法从目标的边框开始,并利用它们的内部表示法在跟踪过程中避免漂移。这些长期跟踪器能够在线评估新帧中目标位置的质量,而无需地面实况数据。
有三个主要组件:TrackerContribSampler、TrackerContribFeatureSet 和 TrackerModel。第一个组件是根据最后一个目标位置计算帧上的补丁的对象。TrackerContribFeatureSet 是管理特征的类,可以对此类许多类型(HAAR、HOG、LBP、Feature2D 等)进行插入。最后一个组件是目标的内部表示,即外观模型。它存储所有状态候选并计算轨迹(最可能的目标状态)。类 TrackerTargetState 表示目标的可能状态。TrackerContribSampler 和 TrackerContribFeatureSet 是目标的可视表示,而 TrackerModel 是统计模型。
可在 [301] 中找到这些算法之间的近期基准。
如果你想创建一个新的跟踪器,那么你需要做的就是以下内容。首先,确定跟踪器的类名(为满足现有的样式,我们建议使用带有“跟踪器”前缀的,例如 trackerMIL、trackerBoosting)——我们在后面的内容中将把此选择称作“类名”。
每个追踪器都有 TrackerContribSampler、TrackerContribFeatureSet 和 TrackerModel 三个部分。前两个是从 Tracker 基类实例化的,而后一个组成部分是抽象的,所以你必须实现你的 TrackerModel。
TrackerContribSampler 已被实例化,但你应该定义采样算法,并将类(或单个类)添加到 TrackerContribSampler 中。你可以选择其中一个现成的实现,例如 TrackerContribSamplerCSC,或者你可以自己实现采样方法,这种情况下类必须继承 TrackerContribSamplerAlgorithm。填写将结果写入“sample”输出参数的 samplingImpl 方法。
创建专门的 TrackerContribSamplerAlgorithm TrackerContribSamplerCSC 的示例:
将 TrackerContribSamplerAlgorithm 添加到 TrackerContribSampler 的示例:
已实例化 TrackerContribFeatureSet(作为第一个实例),但应定义跟踪器中要使用的特征类型。可以使用多个特征类型,因此可在 TrackerContribFeatureSet 中添加 TrackerContribFeatureHAAR 等就绪实现,或开发自己的实现。在此情况下,在 computeImpl 方法中放置提取特征的代码,在 selection 方法中(可选)放置对特征进行微调和选择的代码。
创建专用 TrackerFeature(例如 TrackerContribFeatureHAAR)的示例:
将 TrackerFeature 添加到 TrackerContribFeatureSet 的示例:
TrackerModel 为抽象类,所以在您的实现中,您必须开发一个 TrackerModel,并从 TrackerModel 继承。填写用于估计状态的函数“modelEstimationImpl”,其估计最可能的目标位置,有关详细信息,请参见 [231] 表 I (ME)。填写“modelUpdateImpl”以更新模型,请参见 [231] 表 I (MU)。在此类中,您可以使用 :cConfidenceMap 和 :cTrajectory 来存储模型。第一个表示模型在所有可能的候选状态上,第二个表示所有估计状态的列表。
创建专门 TrackerModel TrackerMILModel 的示例:
并在 Tracker 中添加:
在最后一步,您应根据您的实现定义 TrackerStateEstimator,或者您可以使用 TrackerStateEstimatorMILBoosting 等已就绪类。它表示用于估计最可能的目标状态的模型的统计部分。
创建专门 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 | 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) |
计算一组二维像素的交互矩阵( [132] [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 |
#include <opencv2/video/detail/tracking.detail.hpp>
表示帧 \(k\) 中的目标的模型(所有状态和得分)
参见 [231] 成对 \(\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>
计算一组二维像素的交互矩阵( [132] [52] [53] )。在视觉伺服应用中通常使用此矩阵来命令机器人移动到所需的像素位置或速度。通过对该矩阵求逆,可以估计相机空间速度,即扭曲。
uv | 2xN 个 2D 像素位置的矩阵 |
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 个 2D 像素位置的矩阵 |
duv | 2Nx1 个 2D 像素速度的矩阵 |
depths | 1xN 个深度值的矩阵 |
K | 3x3 相机固有矩阵 |