【发布时间】: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 哦,是的,我忘了提。我增加了所有矩形的边界,使它们相交。感谢您指出了这一点。请参阅适当的编辑。