Как бы я обнаружил края изображения (прозрачный фон) в Java? - PullRequest
5 голосов
/ 15 августа 2011

У меня есть изображение с прозрачным фоном.Я хочу найти края изображения и сформировать многоугольник из контура.Есть несколько способов / способов, которыми я мог бы сделать это.Я хочу сделать это на Java (это для моей игры, использующей полигоны JBox2d для обнаружения столкновений).

Я немного подумал об этом и думаю, как это будет работать.Я мог бы попытаться обнаружить все прозрачные пиксели, затем инвертировать выделение и выбрать только те пиксели, которые имеют 1 смежный прозрачный пиксель.Это все очень сложно, и я хотел бы получить некоторые рекомендации.

Ответы [ 2 ]

3 голосов
/ 15 августа 2011

Есть два аспекта вашего вопроса.

  1. Обнаружение края .Если у вашего изображения есть альфа-канал, то вы сможете выбрать подходящий порог и выполнить обнаружение краев, чтобы найти «края» прозрачных / непрозрачных пикселей.Если это просто GIF с «прозрачным» цветом, то это должно быть немного проще, поскольку вы эффективно работаете с черно-белым изображением.

  2. Векторизация.Вот где это становится (действительно) сложно.Поле преобразования растров в вектор - плодородная почва.Я хотел бы взглянуть на то, как реализованы такие решения, как Potrace (GPL), а затем, возможно, попытаться создать из этого свое собственное.

Однако для игры лично я бы даже не попробовалобнаружение краев / столкновений в реальном времени.Поскольку я работаю со спрайтами, я бы использовал ограничивающие рамки и другие растровые методы .

Если я действительно хочу обнаружение краев / столкновений на основе многоугольника, то я, вероятно, предпочел бы предварительно вручную отследить края и просто сохранить их вместе с каждым растровым изображением, а затем выполнить их вычисления (обмен времени на время).Я предполагаю, что изображения, с которыми вы работаете, не генерируются динамически во время выполнения, что делает возможным предварительное вычисление.

1 голос
/ 15 августа 2011

Это не совсем ответ на ваш вопрос, чтобы создать идеальное пиксельное столкновение, но я хочу сказать, что плохая идея - делать приборы в зависимости от изображений.

  • Box2Dне поддерживает вогнутые фиксаторы.
  • 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

...