跟踪视频中的编号标记

时间:2013-10-05 16:45:40

标签: c++ algorithm opencv markers

我有一个视频,其中包含我在此问题中的上一张图片中显示的帧。

How do we detect points from a picture with a particular color on those points

我检测到这些标记并按下图所示编号:

Marker Data

我的问题如下。在一帧中检测到标记后,我需要在另一帧中检测到它们,并找出标记从其先前位置移动了多少。然而,在第二帧上再次使用我的代码时,我有时会在某些帧中获得不同的标记编号,因此我无法跟踪从一个图像到另一个图像的标记。检测每个图像中的标记也变得很麻烦,并且需要花费大量时间来制作大约200帧的视频。

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

作为一个侧面问题,有一种方法可以实际减少处理时间,这样我就不必在每一帧中检测到脸部和眼睛(请参阅我之前提出的问题链接中给出的图像)让事情更清楚。)

1 个答案:

答案 0 :(得分:1)

  

我的问题如下。我在一帧中检测到标记后   需要在另一帧中检测它们并找出标记多少   已离开之前的位置。但是再次使用我的代码   在第二帧我有时在一些帧中获得不同   标记之间的编号,因此我无法跟踪标记   一个图像到另一个。还检测每个图像中的标记   这是一项繁琐的任务,需要花费大量时间来制作周围的视频   200帧。

     

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

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

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

  1. 从点云中找到所有点(http://en.wikipedia.org/wiki/Convex_hull_algorithms)的凸包。
  2. 边界上的点位于一个组中。
  3. 在处理来自第2点的组中的点之后,删除它们。
  4. 转到第1点。
  5.   

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

    您可以采取一些简单的方法来缩短处理时间:

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