Получить массивы вершин из спрайтаPython

Программы на Python
Ответить
Anonymous
 Получить массивы вершин из спрайта

Сообщение Anonymous »

Мне нужно получить массив ребер/линий, примерно так:
[
[x1, y1, x2, y2],
[x1, y1, x2, y2],
]

Мне нужен этот массив для легкого движка моей игры.
https://www.jujuadams.com/Bulb/#/22.0/B ... id=addedge
В игре я использую «цикл for i» для добавления ребер.
Поэтому я делаю скрипт для Python, который дает мои края, но он работает плохо.
Изображение

Поскольку у меня неправильные данные о вершинах/ребрах, у меня есть графические артефакты
Изображение

Альфа-канал изображения становится черным, а любой цвет исходного изображения становится белым.
Поскольку «маска оттенков серого» улучшает результаты.
Итак, как я могу улучшить код, чтобы получить правильные результаты?
Исходный спрайт:
Изображение

Лучше загружать с Google Диска, поскольку Stack Overflow удаляет альфа-канал из изображения при загрузке.
https://drive.google.com/file/d /1RGUwJ8R6uTmwAZgq9EZril6qRrllTdcB/view?usp=sharing
import numpy as np
import cv2
from matplotlib import pyplot as plt

image_path = 'frog4x.png'

def get_vertex_array(cv_image):
# Load image
img_np = np.array(cv_image)

# Detect edges using Canny
edges = cv2.Canny(img_np, 100, 200)

# Find contours
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# Initialize vertex array
vertex_array = []

for contour in contours:
for i in range(len(contour) - 1):
x1, y1 = contour[0]
x2, y2 = contour[i + 1][0]
vertex_array.append([x1, y1, x2, y2])

return vertex_array

def print_vertex_array(_vertex_array):
print("[")
for vertex in _vertex_array:
print(" ", [vertex[0].item(), vertex[1].item(), vertex[2].item(), vertex[3].item()], ",", sep="")
print("]")

# Original
cvImg = cv2.imread(image_path, cv2.IMREAD_UNCHANGED)
height, width, channels = cvImg.shape
plt.subplot(131), plt.imshow(cvImg)
plt.title('Original Image'), plt.xticks([]), plt.yticks([])

# Grayscale
cvImgGrayscale = cvImg.copy()
cvImgBgGrayscale = cvImg.copy()
alpha_channel = cvImgGrayscale[:, :, 3]
# Create a mask where alpha is not 255 (not fully opaque)
cvImgGrayscale[alpha_channel == 255] = (255, 255, 255, 255)
cvImgGrayscale[alpha_channel == 0] = (0, 0, 0, 255)
cvImgGrayscale = cv2.add(cvImgGrayscale, cvImgBgGrayscale)

plt.subplot(132), plt.imshow(cvImgGrayscale)
plt.title('Gray Scale Image'), plt.xticks([]), plt.yticks([])

# Vertex Image
cvImgEdges = np.zeros((64, 64, 3), np.uint8)
cvImgEdges[:, :, 0] = 255
cvImgEdges[:, :, 1] = 255
cvImgEdges[:, :, 2] = 255
vertexArray = get_vertex_array(cvImgGrayscale)

for vertex in vertexArray:
x1, y1, x2, y2 = vertex
cv2.line(cvImgEdges, (x1, y1), (x2, y2), (255, 0, 0), 1)

plt.subplot(133), plt.imshow(cvImgEdges)
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])

# Show images in matplot
plt.gcf().set_dpi(180)
plt.show()

# Print vertex array to console
print("Vertex Count: " + str(len(vertexArray)))



Подробнее здесь: https://stackoverflow.com/questions/791 ... rom-sprite
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»