OpenCV 3 C++:利用calcOpticalFlowPyrLK实现光流点追踪详解
本文主要介绍了如何使用OpenCV 3中的C++实现光流点追踪,重点讲解了`calcOpticalFlowPyrLK()`函数,这是OpenCV库中用于计算两幅图像之间光流(optical flow)的重要函数。光流是描述视频序列中像素随时间变化的一种二维向量场,它反映了目标和场景中物体的运动。 `calcOpticalFlowPyrLK()`函数接受以下关键参数: 1. `prevImg` (InputArray): 第一幅8位输入图像,或者是通过`buildOpticalFlowPyramid()`函数构建的光流金字塔。光流金字塔是一种图像金字塔结构,用于在不同尺度上进行光流估计,提高计算效率。 2. `nextImg` (InputArray): 第二幅输入图像,同样可以是原始图像或与其具有相同尺寸和类型的光流金字塔。 3. `prevPts` (InputArray): 存储已找到光流的二维点向量,点坐标为单精度浮点数。这些点在第一幅图像中的位置,函数会尝试在第二幅图像中找到它们的新位置。 4. `nextPts` (InputOutputArray): 输出二维点向量,包含第二幅图像中计算出的新点位置。当`OPTFLOW_USE_INITIAL_FLOW`标志启用时,需要提供与输入相同尺寸的初始点位置。 5. `status` (OutputArray): 输出状态向量,用无符号字符表示。如果找到相应的光流特征,对应的元素值为1,未找到则为0。 6. `err` (OutputArray): 输出误差向量,记录每个特征的搜索误差。误差类型可以通过`flags`参数设置,对于未找到的特征,如果没有定义错误,状态参数会标识这种情况。 7. `winSize` (Size): 在每个金字塔层级的搜索窗口大小,通常设置为21x21像素。 8. `maxLevel` (int): 最大金字塔层数,若为0表示不使用金字塔,1表示两层,以此类推。如果输入金字塔,算法将使用金字塔的层数,但不超过`maxLevel`。 9. `criteria` (TermCriteria): 指定迭代搜索算法的终止条件,包括最大迭代次数(criteria.maxCount)和窗口移动阈值(criteria.epsilon)。 10. `flags` (int): 操作标志,控制函数的行为,如是否使用光流初始化、使用哪些误差类型等。 11. `minEigThreshold` (double): 计算光流方程2x2标准矩阵的最小特征值与窗口像素数量的比例。若该值小于`minEigThreshold`,特征会被过滤,避免处理可能的坏点,从而提高算法性能。 在实际应用中,用户需要根据场景选择合适的参数,并结合其他OpenCV函数如`buildOpticalFlowPyramid()`来优化光流追踪的效果。理解并灵活运用这些参数对于获得高质量的光流估计至关重要。