Python:检测到运动周围的重叠框

Posted

技术标签:

【中文标题】Python:检测到运动周围的重叠框【英文标题】:Python: Overlapping boxes around motion detected 【发布时间】:2017-07-25 09:38:57 【问题描述】:

我目前正在做一个运动检测项目,它检测运动并在运动周围绘制一个红色边界框。现在我的程序确实检测运动并围绕运动绘制一个边界框,但也有很多重叠的边界框以及正确的边界框。有没有办法可以减少到只有 1 个盒子?

这是我的代码:

    for c in cnts:
        if cv2.contourArea(c) < 500:
            continue

        (x, y, w, h) = cv2.boundingRect(c)
        cv2.rectangle(frame, (x,y), (x + w, y + h), (0, 0, 255), 2)

这是目前的结果(在网上找到了这张图,但还是同样的问题):

【问题讨论】:

您能否向我们展示当前输出的重叠框和预期图像以及单个框? @ZdaR 我已编辑问题以显示当前输出。预期的输出将只是运动周围的 1 个边界框 你可以使用一个简单的算法,比如盒子是否重叠?如果是,请选择两个框中较大的一个。 @Aplin,你为什么从你的问题中删除代码和图像?这使得任何人都更难回答你的问题。使用您的代码和示例错误输出查看编辑版本,我相信我的回答涵盖了您想要的内容。如果不是这种情况,请在您的问题中澄清。 有多种方法可以“减少到只有 1 个盒子”。如果当前答案不能满足您的特定需求,那么您需要明确确切您想要什么。此外,获取该示例图像并对其进行编辑以显示所需的输出将极大地帮助那些寻求回答您的人。 【参考方案1】:

要在最终结果中仅显示一个边界框,您必须先保存原始图像。然后每次绘制边界框时,都必须在原始原始图像的副本上绘制它,并将这个新绘制的图像保存为结果。

我假设您正在使用一个循环,并且在此循环内您在图像上绘制边界框,但每次都在同一个图像变量上绘制,从而导致多个可见边界框。如果这是一个不正确的假设,那么请在您的问题中澄清,提供更多代码,并提供您的输出的当前示例以及可见的错误,以及所需结果的示例。

如果您只需要描述运动的最新框,则无需担心以下算法。

groupRectangles()

openCV 中有一个内置函数,可以将彼此靠近且形状和大小相似的矩形分组,称为groupRectangles()。它将返回由彼此靠近的组合矩形产生的矩形列表。对于不同版本的 openCV (3.0 beta docs of groupRectangles()),应该有类似的,如果不完全相同的功能。

算法编写简单:

正如hinted by @pypypy 在对您的问题的评论中,如果重绘框太小并且没有显示您想要的运动区域,那么您可以做一个简单的算法来组合它们。但是,由于边界框没有描绘小动作,因此取两个框中较大的一个可能不是您想要的(您需要通过示例阐明您想要的输出)。

有一个简单的算法可以组合边界框,这样您将拥有一个覆盖新边界框和前一个边界框总面积的边界框。该算法涉及从两个框中获取所有 x 和 y 值的最大值和最小值,然后根据这些 x 和 y 值将新框绘制到原始原始图像的副本上。这将创建一个包围盒,封装所有当前和先前的运动区域。

【讨论】:

我已经编辑了我的问题,以向您展示我的更多代码,并添加了我当前的代码输出 @Aplin 看来我的回答回答了你的问题。在您的 for 循环中,您仅在框架上反复调用矩形。这就是你拥有所有这些边界框的原因。您可以将元组作为 Rect 对象从 boundingRect 保存到列表中,然后在循环调用 groupRectangles 后将其传递给列表。然后循环通过其输出绘制生成的边界框。这将允许您检测多个运动区域,但没有重叠的框。或者你可以找到盒子所有角落的最小值和最大值,并从中创建和绘制一个新的单个盒子。这不是解决办法吗?

以上是关于Python:检测到运动周围的重叠框的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV BackgroundSubtractor Android 运动检测器错误

使用 Google Face Detection ML Kit 在现有照片周围绘制一个框

目标检测算法-SoftNMS

某些内存位置的未处理异常

没有在检测到的汽车上拿到盒子

如何使用Soft-NMS实现目标检测并提升准确率