我目前正在做一个动作检测项目,它可以检测动作并在动作周围绘制一个红色边界框。现在我的程序会检测运动并在运动周围绘制一个边界框,但是还有很多重叠的边界框以及正确的边界框。有没有办法可以减少到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)
答案 0 :(得分:1)
要在最终结果中仅显示一个边界框,您必须先保存原始图像。然后,每次绘制边界框时,都必须在原始图像的副本上绘制它,并将此新绘制的图像保存为结果。
我假设您正在使用循环并在此循环内部绘制图像上的边界框,但每次都要在同一图像变量上绘制,从而产生多个可见边界框。如果这是一个不正确的假设,那么请在您的问题中澄清,提供更多代码,并提供输出的当前示例,并显示错误,以及所需结果的示例。
如果您只想要最近描述动作的方框,则无需担心以下算法。
openCV中存在一个内置函数,它将彼此靠近并且形状和大小相似的矩形分组为groupRectangles()。它将返回由彼此靠近的组合矩形产生的矩形列表。对于不同版本的openCV(3.0 beta docs of groupRectangles()),应该有一个类似的(如果不是完全相同的)函数。
对于您的问题的注释中的hinted by @pypypy,如果重绘框太小而且没有显示您想要的运动区域,那么您可以使用简单的算法来组合它们。然而,由于边界框没有描绘小的移动,所以取两个框中较大的一个可能不是你想要的(你需要用一个例子来澄清你想要的输出)。
有一个简单的算法可以组合边界框,这样你就有了一个边界框,它可以覆盖新边界框和前一个边界框的总面积。该算法包括从两个框中获取所有x和y值的最大值和最小值,然后仅将基于这些x和y值的新框绘制到原始原始图像的副本上。这将创建一个边界框,封装所有当前和以前的运动区域。