我正在开发一个程序,用摄像头跟踪和识别反射目标。部分问题是现场可能有多个反射噪声源。
我设计了一个系统,它创建并存储基于光线区域的小矩形(蓝色矩形是我的代码生成的):

现在我基本上需要把相邻的深蓝色矩形合并成一个矩形来形成场景中的光源,这样我就可以做进一步的分析了(在这种情况下,两个光源,两个不同的矩形)。
合并操作的代码如下(其中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;
}
}
}问题是,这段代码似乎工作得不太好。即使没有噪音,它似乎只是有时起作用。下面是它工作的一个例子,并完成我想做的事情(其中淡蓝色的矩形是合并的):

以下是它绝对失败的例子:


这是怎么回事?我的合并逻辑有缺陷吗?请帮帮我!谢谢。
编辑:我意识到它即使在工作的时候也会有一些不准确的地方。例如,在我给出的第二个失败示例中,旋转的目标具有我期望算法创建的正确的边界框。然而,它需要更高(因为右上角不包含在其中)和噪音被不正确地分割成两个矩形。
编辑2:我忘了提到,我将所有深蓝色矩形的边界从图像中实际看到的增加2,以便它们很好地相交,我可以使用intersects()方法,而不仅仅是触摸边缘。此外,该列表按列自上而下排列。
编辑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]

发布于 2017-05-01 02:58:04
每当合并数组的最后两个矩形时,就跳过第一个矩形。内环退出,外部循环增加i。因为您刚刚将i设置为0,这将导致不再考虑第一个矩形。
作为一种解决方案,将这一行替换为:
i = 0;在这方面:
i = -1;
break;可能有更有效的方法来执行循环,但这肯定会解决跳过问题。然后,您可以尝试引入更聪明的索引技术。
https://stackoverflow.com/questions/43713630
复制相似问题