2011-08-15 113 views
4

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

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

+1

我可以想象,如果你这样做,你会最终得到一些非常复杂的多边形形状。我会建议使用简单的形状,这也将有助于性能和游戏性问题。 – MadcoreTom

+0

对不起,如果这有点不好。什么是简单的形状? – liamzebedee

+0

圆形和矩形是原始形状,但三角形或甚至只有几条边的多边形足够简单。在我的应用程序/游戏中,我主要使用盒子和圆圈。我可以告诉你更多,但我在工作。 – MadcoreTom

回答

2

你的问题有两个方面。

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

  2. Vectorization。这是它得到(真的)棘手的地方。光栅向量转换的领域是肥沃的土壤。我会研究如何实现Potrace(GPL)等解决方案,然后尝试构建自己的解决方案。

但是,对于一个游戏,我个人甚至都不会尝试这种实时边缘/碰撞检测。由于我正在使用精灵,我会使用bounding boxes and other raster-based techniques

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

+0

参考最后一段 - 我将手动预先跟踪边缘。我想知道这是否会比具有“基本”形状的效率更低或更高效,或者它对性能没有任何影响? – liamzebedee

+0

这很大程度上取决于您使用的实现和算法(或JBox2D使用的算法)。但总的来说,我认为更简单的形状意味着更快的碰撞检测(更少的边缘检查)。 –

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