OpenCV 4.11.0
开源计算机视觉
加载中…
搜索中…
无匹配项
跟踪API实现细节

详细描述

长期光学跟踪API

长期光学跟踪是许多现实世界计算机视觉应用中的一个重要问题。该领域的进展非常分散,而此API是一个独特的接口,可用于插入多个算法并进行比较。这项工作部分基于[232][163]

这些算法从目标的边界框开始,并通过其内部表示来避免跟踪过程中的漂移。这些长期跟踪器能够在线评估新帧中目标位置的质量,无需地面实况。

主要有三个组成部分:TrackerContribSamplerTrackerContribFeatureSetTrackerModel。第一个组件是根据目标的最后位置计算帧上补丁的对象。TrackerContribFeatureSet是管理特征的类,可以插入许多类型的特征(HAAR、HOG、LBP、Feature2D等)。最后一个组件是目标的内部表示,即外观模型。它存储所有状态候选并计算轨迹(最可能的目标状态)。类TrackerTargetState表示目标的可能状态。TrackerContribSamplerTrackerContribFeatureSet是目标的视觉表示,而TrackerModel是统计模型。

这些算法之间最近的基准测试可以在[302]中找到。

创建你自己的跟踪器

如果你想创建一个新的跟踪器,你需要这样做。首先,决定跟踪器的类名(为了符合现有风格,我们建议使用“tracker”前缀,例如trackerMIL、trackerBoosting)——我们将在后续中将其称为“classname”。

每个跟踪器都有三个组件TrackerContribSamplerTrackerContribFeatureSetTrackerModel。前两个是从Tracker基类实例化的,而最后一个组件是抽象的,因此你必须实现你的TrackerModel

TrackerContribSampler

TrackerContribSampler已经实例化,但是你应该定义采样算法并将类(或单个类)添加到TrackerContribSampler。你可以选择现成的实现,例如TrackerContribSamplerCSC,或者你可以实现你自己的采样方法,在这种情况下,该类必须继承TrackerContribSamplerAlgorithm。填充samplingImpl方法,该方法将结果写入“sample”输出参数。

创建专用TrackerContribSamplerAlgorithm TrackerContribSamplerCSC 的示例:

class CV_EXPORTS_W TrackerContribSamplerCSC : public TrackerContribSamplerAlgorithm
{
public:
TrackerContribSamplerCSC( const TrackerContribSamplerCSC::Params &parameters = TrackerContribSamplerCSC::Params() );
~TrackerContribSamplerCSC();
...
protected:
bool samplingImpl( const Mat& image, Rect boundingBox, std::vector<Mat>& sample );
...
};

TrackerContribSamplerAlgorithm添加到TrackerContribSampler的示例:

//sampler 是 TrackerContribSampler
Ptr<TrackerContribSamplerAlgorithm> CSCSampler = new TrackerContribSamplerCSC( CSCparameters );
if( !sampler->addTrackerSamplerAlgorithm( CSCSampler ) )
return false;
//或者使用默认参数添加 CSC 采样器
//sampler->addTrackerSamplerAlgorithm( "CSC" );
另请参见
TrackerContribSamplerCSCTrackerContribSamplerAlgorithm

TrackerContribFeatureSet

TrackerContribFeatureSet 已经实例化(作为第一个),但是您应该定义跟踪器中将使用哪种类型的特征。您可以使用多种特征类型,因此可以将现成的实现添加为TrackerContribFeatureHAAR 到您的 TrackerContribFeatureSet 中,或者开发您自己的实现。在这种情况下,在 computeImpl 方法中放置提取特征的代码,并在 selection 方法中可选地放置用于特征细化和选择的代码。

创建专用TrackerFeature TrackerContribFeatureHAAR 的示例:

class CV_EXPORTS_W TrackerContribFeatureHAAR : public TrackerFeature
{
public:
TrackerContribFeatureHAAR( const TrackerContribFeatureHAAR::Params &parameters = TrackerContribFeatureHAAR::Params() );
~TrackerContribFeatureHAAR();
void selection( Mat& response, int npoints );
...
protected:
bool computeImpl( const std::vector<Mat>& images, Mat& response );
...
};

TrackerFeature添加到TrackerContribFeatureSet的示例:

//featureSet 是 TrackerContribFeatureSet
Ptr<TrackerFeature> trackerFeature = new TrackerContribFeatureHAAR( HAARparameters );
featureSet->addTrackerFeature( trackerFeature );
另请参见
TrackerContribFeatureHAARTrackerContribFeatureSet

TrackerModel

TrackerModel 是抽象的,因此在您的实现中,您必须开发继承自TrackerModelTrackerModel。填写状态估计方法“modelEstimationImpl”,该方法估计最可能的目标位置,请参见[232] 表 I (ME) 获取更多信息。填写“modelUpdateImpl”以更新模型,请参见[232] 表 I (MU)。在此类中,您可以使用 :cConfidenceMap 和 :cTrajectory 来存储模型。第一个表示所有可能的候选状态下的模型,第二个表示所有估计状态的列表。

创建专用TrackerModel TrackerMILModel 的示例:

class TrackerMILModel : public TrackerModel
{
public:
TrackerMILModel( const Rect& boundingBox );
~TrackerMILModel();
...
protected:
void modelEstimationImpl( const std::vector<Mat>& responses );
void modelUpdateImpl();
...
};

并将其添加到您的Tracker中:

bool TrackerMIL::initImpl( const Mat& image, const Rect2d& boundingBox )
{
...
//model 是通用 Tracker 的通用 TrackerModel 字段
model = new TrackerMILModel( boundingBox );
...
}
Rect_< double > Rect2d
定义 types.hpp:495

在最后一步,您应该基于您的实现定义TrackerStateEstimator,或者您可以使用现成的类,如 TrackerStateEstimatorMILBoosting。它代表模型的统计部分,用于估计最可能的靶标状态。

创建专用TrackerStateEstimator TrackerStateEstimatorMILBoosting 的示例:

class CV_EXPORTS_W TrackerStateEstimatorMILBoosting : public TrackerStateEstimator
{
class TrackerMILTargetState : public TrackerTargetState
{
...
};
public:
TrackerStateEstimatorMILBoosting( int nFeatures = 250 );
~TrackerStateEstimatorMILBoosting();
...
protected:
Ptr<TrackerTargetState> estimateImpl( const std::vector<ConfidenceMap>& confidenceMaps );
void updateImpl(std::vector<ConfidenceMap>& confidenceMaps);
...
};

并将其添加到您的TrackerModel中:

//model 是您追踪器的 TrackerModel
Ptr<TrackerStateEstimatorMILBoosting> stateEstimator = new TrackerStateEstimatorMILBoosting(params.featureSetNumFeatures);
model->setTrackerStateEstimator(stateEstimator);
另请参见
TrackerModel,TrackerStateEstimatorMILBoosting,TrackerTargetState

在此步骤中,您应该根据您的实现定义您的TrackerTargetStateTrackerTargetState 基类仅包含边界框(左上角位置、宽度和高度),您可以添加比例因子、目标旋转等来丰富它。

创建专用TrackerTargetState TrackerMILTargetState 的示例:

class TrackerMILTargetState : public TrackerTargetState
{
public:
TrackerMILTargetState( const Point2f& position, int targetWidth, int targetHeight, bool foreground, const Mat& features);
~TrackerMILTargetState();
...
私有:
bool isTarget;
Mat targetFeatures;
...
};

命名空间

命名空间 cv::detail::tracking::contrib_feature
 
命名空间 cv::detail::tracking::kalman_filters
 
命名空间 cv::detail::tracking::online_boosting
 
命名空间 cv::detail::tracking::tbm
 
命名空间 cv::detail::tracking::tld
 

类 cv::detail::tracking::TrackerContribFeature
 表示特征的TrackerContribFeature抽象基类。更多...
 
类 cv::detail::tracking::TrackerContribFeatureHAAR
 基于 HAAR 特征的TrackerContribFeature,由TrackerMIL 和许多其他算法使用。更多...
 
类 cv::detail::tracking::TrackerContribFeatureSet
 管理特征提取和选择的类。更多...
 
类 cv::detail::tracking::TrackerContribSampler
 管理采样器以选择区域来更新跟踪器模型的类 [AAM] 采样和标记。参见表 I 和 III B 节。更多...
 
类 cv::detail::tracking::TrackerContribSamplerAlgorithm
 表示特定采样器的算法的TrackerContribSamplerAlgorithm抽象基类。更多...
 
类 cv::detail::tracking::TrackerContribSamplerCSC
 基于 CSC(以当前状态为中心)的TrackerSampler,由 MIL 算法TrackerMIL使用。更多...
 
类 cv::detail::tracking::TrackerFeature
 表示特征的TrackerFeature抽象基类。更多...
 
类 cv::detail::tracking::TrackerFeatureFeature2d
 基于Feature2DTrackerContribFeature更多...
 
类 cv::detail::tracking::TrackerFeatureHOG
 基于 HOG 的TrackerContribFeature更多...
 
类 cv::detail::tracking::TrackerFeatureLBP
 基于 LBP 的TrackerContribFeature更多...
 
类 cv::detail::tracking::TrackerFeatureSet
 管理特征提取和选择的类。更多...
 
类 cv::detail::tracking::TrackerModel
 表示目标模型的抽象类。更多...
 
类 cv::detail::tracking::TrackerSampler
 管理采样器以选择区域来更新跟踪器模型的类 [AAM] 采样和标记。参见表 I 和 III B 节。更多...
 
类 cv::detail::tracking::TrackerSamplerAlgorithm
 表示特定采样器的算法的TrackerSamplerAlgorithm抽象基类。更多...
 
类 cv::detail::tracking::TrackerSamplerCS
 基于 CS(当前状态)的TrackerContribSampler,由 TrackerBoosting 算法使用。更多...
 
类 cv::detail::tracking::TrackerSamplerCSC
 基于 CSC(以当前状态为中心)的TrackerSampler,由 MIL 算法TrackerMIL使用。更多...
 
类 cv::detail::tracking::TrackerSamplerPF
 此采样器基于粒子滤波。更多...
 
类 cv::detail::tracking::TrackerStateEstimator
 估计最可能目标状态的TrackerStateEstimator抽象基类。更多...
 
类 cv::detail::tracking::TrackerStateEstimatorAdaBoosting
 基于 ADA-Boosting 的TrackerStateEstimatorAdaBoosting更多...
 
类 cv::detail::tracking::TrackerStateEstimatorSVM
 基于 SVM 的TrackerStateEstimator更多...
 
类 cv::detail::tracking::TrackerTargetState
 表示目标可能状态的TrackerTargetState的抽象基类。更多...
 

类型定义

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
 

类型定义文档

◆ ConfidenceMap

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\) 的集合

另请参见
TrackerTargetState

◆ Trajectory

#include <opencv2/video/detail/tracking.detail.hpp>

表示所有帧的估计状态。

[232] \(x_{k}\) 是目标直到时间 \(k\) 的轨迹

另请参见
TrackerTargetState

函数文档

◆ computeInteractionMatrix()

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])。这通常用于视觉伺服应用中,以命令机器人移动到所需的像素位置/速度。通过反转该矩阵,可以估计摄像机的空间速度,即旋转。

参数
uv2xN 矩阵,表示二维像素位置
depths1xN 矩阵,表示深度值
K3x3 摄像机内参矩阵
J2Nx6 交互矩阵

◆ computeTwist()

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

参数
uv2xN 矩阵,表示二维像素位置
duv2Nx1 矩阵,表示二维像素速度
depths1xN 矩阵,表示深度值
K3x3 摄像机内参矩阵
返回值
cv::Vec6d 6x1 摄像机旋转