如何从静态定位的视频流中可靠地检测滑动门的状态(打开或关闭)

信息处理 计算机视觉 opencv 检测 追踪
2022-02-13 10:15:41

我有一个安装的(静​​态)相机,可以看到一组滑动门。由于门本质上是矩形的,并且它们没有很多自由度,因此这似乎是一个相对容易可靠解决的问题。以下是一些示例视图(我为说明目的绘制了红色的门轮廓,它们没有被算法检测到):

首先,这是关闭的推拉门的视图: 封闭的推拉门

接下来,这是正在打开的滑动门的视图: 打开的推拉门

最后,这是打开但有遮挡的滑动门的视图: 打开和封闭的推拉门

我最初的想法是围绕霍夫变换,但我觉得可能有更好的解决方案,因为我知道门实际上只能沿着一个轴滑动。

重申我的问题,如何可靠地从视频流中检测出滑动门是打开还是关闭,就像我的图像中的那样?

2个回答

为了更好地处理遮挡,我的想法是将这个问题分成检测是否:

  1. 第一扇门处于完全打开的位置(1)
  2. 第一个门处于完全关闭的位置(2)
  3. 第二扇门处于完全打开的位置(3)
  4. 第二扇门处于完全关闭的位置(4)

为了解决这些问题中的任何一个,我将应用以下算法,比如说 (1) :

1.1 从相机中拍摄一张照片作为背景图像。

1.2 裁剪它,只保留第一个门完全打开时应该在的部分,这很容易,因为相机是静态的。

1.3 对来自相机的当前图像执行相同操作。

1.4 计算这两个裁剪图像的绝对差异。

1.5 计算该 absdiff 的平均值(可选地除以裁剪部分的表面以对其进行归一化)。

1.6 根据该值确定门是否完全打开(低值表示可能已打开,低值表示可能未打开),例如使用阈值。

对于步骤 1.1-1.4,尤其是更新背景图像,您可以使用不同的背景减法算法

一旦你可以正确地决定,如果没有太多的遮挡,如果陈述 (1-4) 是真的,你可以,为了处理遮挡,这最有效,假设两个门总是同时处于相同的打开/关闭状态

5.1 保持每个(1-4)部分的(归一化)绝对差平均值

5.2 使用一些算法来决定门是打开还是关闭

我将以您的最后一张图片为例说明步骤 5.2,假设第一扇门是图片底部的一扇门(我们唯一能看到的门):

  • “门 2 完全关闭”和“门 2 完全打开”的 absdiff 平均值都很高,因为该人在这两个地方的前面。所以(3)和(4)都被说成是假的(或真取决于你如何实现它),这是不太可能的。

  • (2) 的 absdiff 平均值较高,但 (1) 的平均值较低。

-> 因此,5.2 的可能算法可以使用 (1) 和 (2) 以及 (3) 和 (4) 的 absdiff 平均值之间的差异作为阈值。

我认为,加上一些去噪技术,就可以完成这项工作。

如果我的解决方案对您来说不清楚,请随时在评论中询问我。

编辑:没有看到帖子的日期,我不知道为什么它在我的提要中出现这么晚,我让这个答案以防它对其他人有用。

我认为跟踪窗户的角落或把手之类的运动会起作用。考虑以下程序: 1.跟踪windwo的角点 2.如果角点的位置变化超过X像素(你确定X),改变状态我建议使用对象跟踪算法。我认为最好的候选点是窗口的角落。对于角点跟踪,我知道的最佳算法是 KLT(OpenCV 实现)和卡尔曼滤波器。我认为以下算法会起作用,并且由于这些算法逐帧更新,它们可以处理光线和障碍物的环境变化。

在此处输入图像描述