如何在Java中检测图像的边缘(透明背景)?

时间:2011-08-15 06:05:28

标签: java image collision-detection jbox2d

我的图像带有透明背景。我想找到图像的边缘并从轮廓中形成一个多边形。有多种方法/方法可以做到这一点。我想用Java做它(它用于我的游戏,它使用JBox2d Polygons进行碰撞检测)。

我已经考虑过这个问题,并且正在考虑这是如何工作的。我可以尝试检测所有透明像素,然后反转选择并仅选择具有1个相邻透明像素的像素。这一切都非常复杂,我想要一些指导。

2 个答案:

答案 0 :(得分:2)

您的问题有两个方面。

  1. Edge-detection。如果您的图像具有Alpha通道,那么您应该能够选择合适的阈值并执行边缘检测以找到透明/不透明像素的“边缘”。如果它只是一个带有“透明”颜色的GIF,那么它应该会更容易,因为你有效地使用黑色&白色图片。

  2. Vectorization。这是(非常)棘手的地方。光栅到矢量转换的领域是肥沃的土壤。我会看看如何实施像Potrace(GPL)这样的解决方案然后尝试建立我自己的解决方案。

  3. 然而,就个人而言,对于游戏,我甚至不会以这种方式尝试实时边缘/碰撞检测。由于我正在使用精灵,我会使用bounding boxes and other raster-based techniques

    如果我真的想要基于多边形的边缘/碰撞检测,那么我可能会选择事先手动跟踪边缘并将它们与每个光栅图像一起存储,然后对它们进行计算(交易空间的时间)。我认为您使用的图像不是在运行时动态生成的,因此可以进行预先计算。

答案 1 :(得分:0)

对于你的问题来说,这并不能解决像素完美碰撞的问题,但我想说根据图像制作灯具是一个坏主意。

  • Box2D不支持concave灯具。
  • Box2D(C ++中的原始版本,我不知道它在JBox2D中是如何工作的)每个多边形有8个顶点的限制。

由于这两个原因,您可能会考虑为每个像素创建一个方形夹具,但这在处理时间上会非常昂贵。

在我几乎完成的游戏中,我正在用关卡编辑器定义我的灯具 以下是我的一个级别(xml)的摘录:

<body id="STONE" depth="13" angle="0.000000" type="static" x="7.939437" y="0.750494" tags=""  >
    <image id="stone_img" img="IMG_STONE" depth="0" x="-0.362081" y="0.526663" w="1.400000" h="1.600000" angle="0.000000" colorize="ffffffff"/>
    <fixture id="" density="1.000000" friction="0.300000" restitution="0.300000" sensor="false" shape="rect" x="-0.188671" y="0.806253" w="1.000000" h="2.200000" angle="0.545597" tags="" />
    <fixture id="" density="1.000000" friction="0.300000" restitution="0.300000" sensor="false" shape="rect" x="0.412080" y="-0.097607" w="1.000000" h="2.200000" angle="0.000000" tags="" />
</body>

我认为这是使用Box2D的最佳方式 希望这能激发你的灵感:D