【问题标题】:How to preprocess video for better OpenCV tracking?如何预处理视频以获得更好的 OpenCV 跟踪?
【发布时间】:2022-01-12 07:29:03
【问题描述】:

我正在尝试为残疾人改进基于网络摄像头的 OpenCV 鼠标控制器(MFC C++ 应用程序):https://preability.com/face-controlled-mouse/ 光标移动,当一个人移动她/他的头时,在微笑时点击等等。

控制器找到面部区域,然后使用 goodFeaturesToTrack、cornerSubPix 和 calcOpticalFlowPyrLK。 一般来说,如果照明良好,我设法稳定光标。 我现在用的:

  1. 评估和过滤每个角点运动的方向。
  2. 为 cv::goodFeaturesToTrack() 将角点分布在整个面部区域也有所帮助。
  3. 光标位置的 EWMA(或卡尔曼)滤波器。
  4. 我已经为面部 ROI 包含了 equalizeHist()。探测器在弱光条件下的表现要好得多。
  5. 另外,我尝试了OpenCV的形态学运算,没有改进。

但是,角点仍然在不均匀的照明中起舞。 我可以看到类似的旧程序 eViacam 具有网络摄像头 Creavision 的预处理模块(也很旧),并且角点更稳定。

请告知输入 Mat 可以做什么?或者如何在合理的 CPU 负载下处理视频?

【问题讨论】:

标签: c++ opencv mfc tracking opticalflow


【解决方案1】:

现在我可以回答我自己的问题了。 Christoph Rackwitz给了我一些好的建议:

不要跟踪整个头部。跟踪每个功能。不要使用那些跟踪器,它们太复杂了。使用苔藓。它很愚蠢但非常精确,只要对象(应该是脸上的一个小特征)没有太大变化。 MOSSE 接近光流。计算光流的方法像 MOSSE 一样工作,除了它们使用更简单的数学和更小的区域,因此结果更嘈杂。 MOSSE 使用更大的区域(当然对于单个轨迹/点)和更复杂的数学,以获得更准确的结果。

当 MOSSE 算法跟踪“角点”时,光标移动得更加顺畅。由于对象矩形同时移动相同数量的像素,离散移动存在一个小问题。光标跳跃着移动。所以,我不得不在每个跟踪点上使用过滤器。无论如何,正如您在视频中看到的那样,与 Lukas-Kanade 光流算法 + 仅过滤光标位置相比,CPU 负载并没有增加。在良好的光线下,差异也非常明显。

https://www.youtube.com/watch?v=WKwuas0GVkA

  1. Lucas-Kanade 光流:

goodFeaturesToTrack, 角子像素, calcOpticalFlowPyrLK, 光标 EWMA 过滤器

  1. MOSSE 对象跟踪:

goodFeaturesToTrack, 角子像素, 追踪器MOSSE, 全点EWMA过滤

当然,我必须记住在添加旧版 Tracker 时将 tracking453.lib 包含到 Linker。我花了半天时间在谷歌上搜索“未解决的外部符号 LNK2001 错误”。出于某种原因,包含来自核心库 (cv::Tracker) 的跟踪器不会导致此类编译错误,因此令人困惑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 2019-08-05
    • 2011-11-21
    • 1970-01-01
    • 2018-07-19
    相关资源
    最近更新 更多