【问题标题】:How would I detect the edges of an image (transparent background) in Java?如何在 Java 中检测图像的边缘(透明背景)?
【发布时间】:2011-08-15 06:05:28
【问题描述】:

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

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

【问题讨论】:

  • 我可以想象,如果你这样做,你最终会得到一些非常复杂的多边形形状。我建议使用简单的形状,这也有助于解决性能和游戏问题。
  • 对不起,如果这有点无聊。什么是简单的形状?
  • 圆形和矩形是原始形状,但三角形甚至只有几条边的多边形都足够简单。在我的应用程序/游戏中,我主要使用盒子和圆圈。我可以告诉你更多,但我在工作。
  • 例如Shape 的实现,其联合形成Area

标签: java image collision-detection jbox2d


【解决方案1】:

您的问题有两个方面。

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

  2. Vectorization。这就是它变得(真的)棘手的地方。光栅到矢量的转换领域是一片沃土。我会看看 Potrace (GPL) 等解决方案是如何实现的,然后可能会尝试构建自己的解决方案。

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

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

【讨论】:

  • 参考最后一段-我将事先手动跟踪边缘。我想知道这是否会比具有“基本”形状的效率更低或更高效,或者它真的不会对性能产生任何影响?
  • 这在很大程度上取决于您使用的实现和算法(或 JBox2D 使用的)。不过,总的来说,我希望更简单的形状意味着更快的碰撞检测(要检查的边缘更少)。
【解决方案2】:

这并不是对您进行像素完美碰撞的问题的真正答案,但我想说根据图像制作固定装置是一个坏主意。

  • 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

【讨论】:

    猜你喜欢
    • 2014-03-23
    • 2019-03-20
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多