【问题标题】:Issues with algorithm to merge adjacent rectangles合并相邻矩形的算法问题
【发布时间】:2017-09-28 13:05:21
【问题描述】:

我正在开发一个使用网络摄像头跟踪和识别反射目标的程序。部分问题在于场景中可能存在多个反射噪声源。

我设计了一个系统,该系统可以创建和存储基于明亮区域的小矩形(蓝色矩形是我的代码生成的):

现在我基本上需要将相邻的深蓝色矩​​形合并为一个矩形,以形成场景中的光源,以便我可以进行进一步分析(在本例中为 2 个光源,因此为 2 个不同的矩形)。

我的合并操作代码如下:(lo.polygon 是一个包含我的深蓝色 Rectangles 的 ArrayList)

       for (int i = 0; i < lo.polygon.size(); i++) {
            Rectangle r0 = lo.polygon.get(i);
            for (int n = i + 1; n < lo.polygon.size(); n++) {
                Rectangle r1 = lo.polygon.get(n);
                if (r0.intersects(r1)) {
                    int x0 = Math.min(r0.x, r1.x);
                    int y0 = Math.min(r0.y, r1.y);
                    int w = Math.max(r0.x + r0.width, r1.x + r1.width) - x0;
                    int h = Math.max(r0.y + r0.height, r1.y + r1.height) -y0;
                    lo.polygon.set(i, new Rectangle(x0, y0, w, h));
                    lo.polygon.remove(n);
                    i=0;
                }
            }
        }

问题是,这段代码似乎运行得不太好。即使没有噪音,它似乎也只是有时起作用。这是它工作的一个示例,并按照我的意图进行操作(浅蓝色矩形是合并的矩形):

以下是绝对失败的例子:

发生了什么?我的合并逻辑有缺陷吗?请帮忙!谢谢。

编辑:我意识到 OFC 即使在其工作时也会有一些不准确之处。例如,在我给出的第二个失败示例中,旋转的目标大部分具有我希望算法创建的正确边界框。但是,它需要更高(因为右上角不包含在其中)并且噪声被错误地分成两个矩形。

编辑 2: 我忘了说,我将所有深蓝色矩形的边界从您在图像中实际看到的范围增加 2,以便它们很好地相交,我可以使用 @987654334 @ 方法,而不仅仅是触摸边缘。此外,该列表按列自上而下排列。

编辑 3: 另一个失败的示例案例(带有数字数据)

这些是生成的浅蓝色矩形:

java.awt.Rectangle[x=270,y=288,width=213,height=98]
java.awt.Rectangle[x=296,y=144,width=238,height=106]
java.awt.Rectangle[x=270,y=288,width=230,height=108]

【问题讨论】:

  • @TedHopp 我没有机会阅读。
  • 那是因为我的回答完全不对。我错过了您在合并矩形时将 i 设置回 0。
  • @TedHopp 哦,是的 xD 抱歉,我只是想确认一下。
  • 也许问题在于Rectangle#intersects 只测试矩形的内部是否重叠。我不相信它会检查矩形是否共享边界。
  • @TedHopp 哦,是的,我忘了提。我增加了所有矩形的边界,使它们相交。感谢您指出了这一点。请参阅适当的编辑。

标签: java algorithm merge


【解决方案1】:

只要合并数组的最后两个矩形,就会跳过第一个矩形。内部循环退出,然后外部循环递增i。由于您刚刚将 i 设置为 0,这将导致不再考虑第一个矩形。

作为解决方案,替换此行:

i = 0;

用这个:

i = -1;
break;

可能有更有效的方法来进行循环,但这肯定会解决跳过问题。然后你可以尝试引入更聪明的索引技术。

【讨论】:

  • 哇。非常感谢,我已经调试了 2 个小时。现在工作得很好。我觉得自己像个彻头彻尾的白痴。多么愚蠢的错误。我发誓我比那更好;)
  • 至于巧妙的技术,数组实际上是按列自上而下的顺序排列的,所以你可能是正确的。我只是想让这种简单的方法首先工作。 TY
猜你喜欢
  • 2010-10-13
  • 2012-11-26
  • 1970-01-01
  • 2012-11-24
  • 2021-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
相关资源
最近更新 更多