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

如何在Java中检测图像(透明背景)的边缘?,java,image,collision-detection,jbox2d,Java,Image,Collision Detection,Jbox2d,我有一个透明背景的图像。我想找到图像的边缘,并从轮廓形成一个多边形。我有多种方法/方法可以做到这一点。我想在Java中实现它(这是我的游戏,它使用JBox2d多边形进行碰撞检测) 我对此有过一些想法,并且正在思考这将如何工作。我可以尝试检测所有透明像素,然后反转选择,只选择具有1个相邻透明像素的像素。这一切都很复杂,我需要一些指导。你的问题有两个方面 。如果您的图像具有alpha通道,那么您应该能够选择合适的阈值并执行边缘检测,以找到透明/不透明像素的“边缘”。如果它只是一个带有“透明”颜色的G

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


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

你的问题有两个方面

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

  • 。这就是它变得(真的)棘手的地方。光栅到矢量转换的领域是肥沃的土壤。我会看看像Potrace(GPL)这样的解决方案是如何实现的,然后可能会尝试在这个基础上构建自己的解决方案

  • 然而,就个人而言,对于一个游戏,我甚至不会用这种方式尝试实时边缘/碰撞检测。因为我和精灵一起工作,所以我会使用


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

    这并不是对您提出的像素完美碰撞问题的回答,但我想说的是,根据图像制作装置是一个坏主意

    • Box2D不支持固定装置
    • BX2D(C++中的原始版本,我不知道它在JBOX2D中是如何工作的)每个多边形的顶点有8个限制。
    由于这两个原因,您可能会认为每像素创建一个正方形固定装置,但这将是非常昂贵的处理时间

    在我即将完成的游戏中,我正在用关卡编辑器定义我的固定装置。
    以下是我的一个级别(xml)的摘录:

    
    
    我认为这是使用Box2D的最佳方式。

    希望这能启发你:D

    我可以想象,如果你那样做的话,你会得到一些非常复杂的多边形形状。我建议使用简单的形状,这也将有助于解决性能和游戏性问题。如果这有点不合时宜,很抱歉。什么是简单形状?圆和矩形是基本形状,但三角形甚至只有几条边的多边形就足够简单了。在我的应用程序/游戏中,我主要使用方框和圆圈。我可以告诉你更多,但我在工作。的实现,其并集形成一个。参考最后一段-我将事先手动跟踪边缘。我想知道这是否会比使用“基本”形状效率更低或更高,或者它真的不会对性能产生任何影响?这在很大程度上取决于您使用的实现和算法(或者JBox2D使用的算法)。不过,一般来说,我认为更简单的形状意味着更快的碰撞检测(需要检查的边更少)。
    <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>