合并相邻矩形的算法问题

时间:2017-05-01 02:48:02

标签: java algorithm merge

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

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

enter image description here

现在我需要基本上需要将相邻的深蓝色矩​​形合并为一个矩形以在场景中形成光源,以便我可以进行进一步的分析(在这种情况下,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;
                }
            }
        }

问题是,这段代码似乎并没有很好地运作。即使没有噪音,它似乎有时也会起作用。这是一个工作的例子,做我想做的事情(浅蓝色矩形是合并的):

enter image description here

以下是绝对失败的例子:

enter image description here

enter image description here

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

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

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

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

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

intersects()

enter image description here

1 个答案:

答案 0 :(得分:1)

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

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

i = 0;

用这个:

i = -1;
break;

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