【发布时间】:2015-06-13 21:56:51
【问题描述】:
在使用 OpenCV 进行检测任务时,我一直遇到合并重叠边界框的问题;也就是说,本质上是在两个重叠边界框的并集周围找到边界框。这在对象检测中经常出现,因为某种原因,感兴趣的对象被分割成多个边界框,而不是一个包罗万象的边界框。
在 StackOverflow 上有一些算法解决方案和有用的外部库的答案(例如 this、this、this),还有 OpenCV 提供的 groupRectangles 函数(以及一连串相关问题/错误:this、this 等)。
我似乎发现上述解决方案对于我正在尝试执行的任务来说有点过于复杂。许多算法解决方案从数学角度解决了这个问题(更像是一个思想实验),而当矩形数量很高时,像rect1 | rect2 这样的操作会变得非常慢(处理所有事情都是 O(N^2) ) 和groupRectangles 有一些怪癖,使其仅部分有效。所以我想出了一个有点骇人听闻的解决方案,它实际上非常有效。我想我会在下面与其他需要快速解决此常见问题的人分享。
欢迎评论和批评。
【问题讨论】:
-
测试交集:cv::Rect intersect = rect1 && rect2;组合:if(intersection.width) 组合 = rect1 || rect2;
-
@Micka 但这需要你遍历 N 个矩形 N 次。对于一个小的 N 很好。但根据经验,我发现当你得到更大的 N 时,二次运行时间最终会比我下面的解决方案慢
-
这显然是真的!您可以对空间进行分区(类似于您的答案),但是对于较小的数字会很慢并且可能会使用更多的内存。
-
@Micka 也是可行的。我发布此内容的部分原因是因为它也相当轻巧且易于实现。一旦你进入分区和诸如此类的事情往往会滚雪球
-
@marcman 我认为为了使这篇文章更有价值,你应该更好地指定 1)合并 2 个矩形是什么意思,特别是在结果方面:你只想要交集,还是面积的总和,还是最小 x0 和 y0(顶角 r 坐标)和最大 x1 和 y1(底角坐标)? 2)“太复杂”是什么意思?加工太复杂、太贵? 3)为什么你的特殊解决方案更适合?这是否取决于您拥有的输入数据类型?如果是,请更详细地描述您的输入数据。
标签: c++ opencv bounding-box object-detection