此页面由 AI 自动翻译。查看英文原版

本页目录

  • 如何放置
  • 输入和输出
  • 用法
  • 功能示例
  • 工作原理
  • 图像单元格
  • 初始 Harris 阈值
  • 新特征的进入条件
  • 已跟踪特征的 Harris 阈值
  • 特征维护
  • 新位置计算
  • 参考

FeatureTracker

Supported on:RVC2RVC4
FeatureTracker 节点会在一帧中检测关键点(特征),并在下一帧中跟踪它们。有效特征通过 Harris 分数或 Shi-Tomasi 获得。 默认目标特征数为 320,默认最大特征数为 480。

如何放置

Python

Python
1with dai.Pipeline() as pipeline:
2    featureTracker = pipeline.create(dai.node.FeatureTracker)

C++

C++
1dai::Pipeline pipeline;
2auto featureTracker = pipeline.create<dai::node::FeatureTracker>();

输入和输出

用法

Python

Python
1with dai.Pipeline() as pipeline:
2    featureTracker = pipeline.create(dai.node.FeatureTracker)
3
4    # 设置着色器和内存切片的最大数量
5    featureTracker.setHardwareResources(2, 2)
6    # 指定等待配置消息到达 inputConfig 输入。
7    featureTracker.setWaitForConfigInput(True)
8
9    # 您必须将 FeatureTracker 与
10    # 图像帧源 - 单目/彩色摄像头或 xlinkIn 节点结合使用

C++

C++
1dai::Pipeline pipeline;
2auto featureTracker = pipeline.create<dai::node::FeatureTracker>();
3
4// 设置着色器和内存切片的最大数量
5featureTracker->setHardwareResources(2, 2);
6// 指定等待配置消息到达 inputConfig 输入。
7featureTracker->setWaitForConfigInput(true);
8
9// 您必须将 FeatureTracker 与
10// 图像帧源 - 单目/彩色摄像头或 xlinkIn 节点结合使用

功能示例

工作原理

图像单元格

为了让特征遍布整个图像,图像被划分为多个单元格,然后分别处理。每个单元格的 目标特征数 = 帧目标特征数 / 单元格数量 单元格的数量可以在水平和垂直方向上配置。默认单元格数量为 4(水平)x 4(垂直)。这意味着每个单元格的默认目标特征数为: 320 / (4 * 4) = 20。请注意,如果一个已跟踪的点恰好在新坐标中位于一个已满的单元格内,它不会被移除,因此特征数量可能会超过此限制。

初始 Harris 阈值

此阈值控制将要检测到的特征的最小强度。将此值设置为 0 可启用自动阈值,用于适应不同场景。如果纹理很多,则需要增加此值,以限制检测到的点的数量。每个单元格都有自己的阈值。

新特征的进入条件

新特征的进入条件是:
  • 特征彼此之间不能太近(最小距离标准 - 默认值为 50,测量单位为像素中的平方欧氏距离),
  • 特征的 Harris 分数足够高,
  • 单元格中有足够的空间容纳该特征(未达到目标特征数)。

已跟踪特征的 Harris 阈值

一旦检测到特征并开始跟踪它,我们就需要在每张图像上更新其 Harris 分数。 此阈值定义了必须移除该特征的点。 目标是尽可能长时间地跟踪点,因此进入点的条件高于已跟踪点的条件。这就是为什么此值通常小于检测阈值。

特征维护

算法必须决定在后续帧中移除哪些特征以及保留哪些特征。请注意,已跟踪特征优先于新特征。 它将移除以下特征:
  • 跟踪误差过大(未正确跟踪),
  • Harris 分数过低(可配置阈值)。

新位置计算

上一帧的特征在当前帧中的位置可以通过两种方式计算:
  1. 使用金字塔 Lucas-Kanade 光流法。
  2. 使用密集运动估计硬件块(块匹配器)。

参考

class

dai::node::FeatureTracker

#include FeatureTracker.hpp
variable
std::shared_ptr< FeatureTrackerConfig > initialConfig
Initial config to use for feature tracking.
variable
Input inputConfig
Input FeatureTrackerConfig message with ability to modify parameters in runtime. Default queue is non-blocking with size 4.
variable
Input inputImage
Input message with frame data on which feature tracking is performed. Default queue is non-blocking with size 4.
variable
Output outputFeatures
Outputs TrackedFeatures message that carries tracked features results.
variable
Output passthroughInputImage
Passthrough message on which the calculation was performed. Suitable for when input queue is set to non-blocking behavior.
function
FeatureTracker()
function
FeatureTracker(std::unique_ptr< Properties > props)
function
void setHardwareResources(int numShaves, int numMemorySlices)
Specify allocated hardware resources for feature tracking. 2 shaves/memory slices are required for optical flow, 1 for corner detection only.
Parameters
  • numShaves: Number of shaves. Maximum 2.
  • numMemorySlices: Number of memory slices. Maximum 2.
inline function
DeviceNodeCRTP()
inline function
DeviceNodeCRTP(const std::shared_ptr< Device > & device)
inline function
DeviceNodeCRTP(std::unique_ptr< Properties > props)
inline function
DeviceNodeCRTP(std::unique_ptr< Properties > props, bool confMode)
inline function
DeviceNodeCRTP(const std::shared_ptr< Device > & device, std::unique_ptr< Properties > props, bool confMode)

需要帮助?

请前往 Discussion Forum 获取技术支持或提出您可能有的任何其他问题。