我正在制作一个用网络摄像头跟踪和识别反射目标的程序。部分问题是场景中可能存在多个反射噪声源。
我设计了一个基于光区域创建和存储小矩形的系统(蓝色矩形是我的代码生成的):
现在我需要基本上需要将相邻的深蓝色矩形合并为一个矩形以在场景中形成光源,以便我可以进行进一步的分析(在这种情况下,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,以便它们很好地相交,我可以使用{{ 1}}方法,而不仅仅是触摸边缘。此外,列表按列自上而下排序。
编辑3:另一个失败的示例案例(包含数字数据)
这些是生成的浅蓝色矩形:
intersects()
答案 0 :(得分:1)
每当合并数组的最后两个矩形时,就会跳过第一个矩形。内循环退出,外循环然后递增i
。由于您只是将i
设置为0,这将导致永远不会再考虑第一个矩形。
作为解决方案,请替换此行:
i = 0;
用这个:
i = -1;
break;
可能有更有效的方法来进行循环,但这肯定会解决跳过问题。然后你可以尝试引入更聪明的索引技术。