1

我有一个视频,其帧如我在这个问题中的上一张图片中所示。

我们如何从这些点上具有特定颜色的图片中检测点

我检测到这些标记并将它们编号,如下图所示:

标记数据

我的问题如下。在我在一帧中检测到标记后,我需要在另一帧中检测它们并找出标记从其先前位置移动了多少。但是,在第二帧上再次使用我的代码时,有时我在某些帧中会在标记之间获得不同的编号,因此我无法跟踪从一个图像到另一个图像的标记。此外,检测每张图像中的标记也成为一项繁琐的任务,并且对于大约 200 帧的视频需要花费大量时间。

我如何在图像上跟踪这些标记,以便知道特定标记在帧之间移动了多少,或者只是如何对这些标记进行编号,以使编号永远不会改变,即编号为 60 的标记从第 1 帧到第 60 帧仍然是标记编号200。

作为一个附带问题,是否有一种方法可以实际减少处理时间,这样我就不必在每一帧中检测面部和眼睛(请参阅我上一个问题中链接中给出的图像,它使事情更清晰)。

4

1 回答 1

1

我的问题如下。在我在一帧中检测到标记后,我需要在另一帧中检测它们并找出标记从其先前位置移动了多少。但是,在第二帧上再次使用我的代码时,有时我在某些帧中会在标记之间获得不同的编号,因此我无法跟踪从一个图像到另一个图像的标记。此外,检测每张图像中的标记也成为一项繁琐的任务,并且对于大约 200 帧的视频需要花费大量时间。

我如何在图像上跟踪这些标记,以便知道特定标记在帧之间移动了多少,或者只是如何对这些标记进行编号,以使编号永远不会改变,即编号为 60 的标记从第 1 帧到第 60 帧仍然是标记编号200。

也许考虑使用光流技术 - http://robotics.stanford.edu/~dstavens/cs223b/

或者尝试将您的点云分成更小的部分,而不是检测轮廓。您可以使用线条或使用这个简单的想法(未经测试或分析)来划分它:

  1. 从您的点云中找到所有点的凸包 ( http://en.wikipedia.org/wiki/Convex_hull_algorithms )。
  2. 边界上的点属于一组。
  3. 从点 2 处理组中的点后,将其删除。
  4. 转到第 1 点。

作为一个附带问题,是否有一种方法可以实际减少处理时间,这样我就不必在每一帧中检测面部和眼睛

您可以做一些简单的事情来减少处理时间:

  • 在处理每一帧期间不要加载 haar 级联 - 在开始从相机/视频文件获取帧之前只加载一次。
  • 如果需要在每一帧中只找到一个人脸,请使用 CV_HAAR_FIND_BIGGEST_OBJECT 标志 - 搜索将只返回一个(最大的)对象。它应该更快,因为搜索将从最大的窗口开始,另外,当 haar 检测器找到一个对象时,它将中止搜索并返回该对象。
  • 玩参数并检查不同的级联
  • 一旦您在帧编号中找到n比在帧编号中的面孔,n+1请不要在整个帧中执行搜索 - 扩展您在n帧中找到面孔的矩形并仅在此扩展矩形中搜索。你应该扩大多少?这取决于用户移动头部的速度;) 50% 是很大的容忍度,但也很慢。最好的选择是自己找到这个值。
  • 如果您的图像不会发生太大变化,您可以在大多数帧中跳过检测面部,并假设它与前一帧在同一个位置 - 只需检查帧是否发生了很大变化。最简单的方法是使用 OpenCV 进行运动检测(正如作者所提到的 - 最好对减法结果使用二进制阈值来忽略因噪声而发生的变化)。我在我的 BSc 论文(眼动追踪系统)中使用了这种方法,它效果很好,提高了整个系统的速度。注意 - 不时强制进行正常(使用 haar 级联)搜索是个好主意(我决定每 3 帧执行一次,但您可以尝试减少搜索频率) - 它可以让您避免出现以下情况使用的已移动到相机区域之外并且系统没有注意到它。
于 2013-10-11T01:47:40.867 回答