【问题标题】:OpenCV C++ contours - keeping results contiguous over framesOpenCV C++ 轮廓 - 使结果在帧上保持连续
【发布时间】:2016-04-04 03:12:55
【问题描述】:

我在 OpenCV 中有一个实时应用程序,我需要获取当前视频帧,并分析它的轮廓,然后使用这些轮廓的质心。到目前为止,基础知识都很好并且工作正常。

我预见的问题是我的输入帧“嘈杂”,以至于我可能会看到每个帧的质心数量不同,这是我感兴趣的处理方法。

我感兴趣的对象在每一帧中都会产生积极的命中,例如,如果我期望 14 个,那么每帧我会至少得到 14 个。我也先验地知道框架中对象之间的空间关系(例如,它们永远不会交叉,存在对称性,例如在其他规则中,左上角的规则就是:左上角 - always)所以我可以相信无论 openCV findContours 函数找到它们的顺序如何,都将保持不变(例如,它可能会发现找到的第三个轮廓始终是左上角的)。

问题在于误报,因为它们对排序感到奇怪,以至于我刚刚概述的“逻辑”不友好地分崩离析。假阳性可以出现在任何地方,我最终可能有 15 个质心,因此“3”现在可能是假阳性,“4”是左上角,依此类推。

问题:它看起来只是一个单击功能 - 清除你的向量并重新开始之类的东西 - 但是 OpenCV 有没有办法解决这个问题?

如果我必须自己动手 - 他们通常的策略是什么?

由于帧中的对象在连续帧之间的“范围内”是连续的,我猜想我可以玩这个 - 再加上前面提到的已知空间关系(再次,“在一个范围内”) - 我可能正在做饭加气 :) - 事情是,我会在每一帧之间这样做......

就循环执行时间而言,我面临着很短的时间要玩的墙 - 如果我可以依靠已经解决的具有最佳算法复杂性的问题而不是我自己的杂乱无章,我完全赞成。

有人要教我什么吗? (我说得有道理吗?)

SO 建议的“可能已经有你答案的问题” - 肯定是相关的 - 但更具体,我的可能更笼统(?)

【问题讨论】:

  • 一张图片会让问题更清楚,尽管你的回答对我很有用。
  • @Shan True... 见答案。

标签: c++ opencv image-processing


【解决方案1】:

在此期间一直在做更多的研究......

只需要谷歌的关键词,然后它就到位了 - “多对象跟踪”和“数据关联”

看起来该方法适用于每一帧:

  1. 使用卡尔曼滤波器预测质心的下一个位置

  2. 使用匈牙利算法“最佳”拟合预测质心 候选人进入 14 个可用名额 - 如果有误报 他们将是这一步之后剩下的人

  3. 质心不再是候选对象,但 现在的质心,所以 计算卡尔曼滤波器的更新/校正步骤

  4. 冲洗/重复...

这是非常具有统计意义的 - 您永远不知道它是否“正确”(即误报可能会引导出正确的候选人),但请相信它是可以在它提供的复杂性范围内完成的最好的。如果卡尔曼滤波器调得好,那么人类可能会犯同样的错误......

事后诸葛亮不是 20/20 :)

仍然需要实现,也许我看到结果时会编辑我的答案。


UPDATE> 实施成功 - 以下是一些记录:

【讨论】:

    猜你喜欢
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多