[PYTHON] Bloquez et dessinez des images avec Minecraft Pi Edition

J'ai acheté une tarte aux râpes à article précédent et n'ai encore utilisé que Bluetooth, mais j'ai remarqué. Oui, Minecraft est installé sur Raspbian!

Je voulais essayer Micra, donc je vais jouer un peu.

Minecraft Pi Edition J'ai trouvé un site de résumé. https://matome.naver.jp/m/odai/2142545327953860701

Les fonctionnalités de Pi Edition sont les suivantes.

Il semble y avoir un correctif non officiel qui active le mode survie. La taille de l'avion n'est que de 256 x 256, donc si vous voulez programmer et jouer et le faire sérieusement, vous pouvez acheter la version PC.

Document officielもプログラミングすること前提で書かれているみたい。

Quoi faire

La tuile de carte qui vous vient à l'esprit lorsque vous entendez 256 x 256! (Maladie professionnelle) https://en.m.wikipedia.org/wiki/Tiled_web_map

À titre de test, dessinons une tuile de carte.

Ce que j'ai utilisé

Je ne savais pas si je pouvais utiliser Python3, j'ai donc choisi Python2.

la mise en oeuvre

Lisez l'image avec OpenCV, vérifiez la valeur RVB de chaque pixel et placez des blocs près de cette couleur.

Installation d'OpenCV

J'ai pu l'installer en suivant les étapes de l'article suivant. http://qiita.com/suppy193/items/91609e75789e9f458c39

$ sudo apt-get update
$ sudo apt-get install libopencv-dev
$ sudo apt-get install python-opencv

Charger l'image et obtenir la valeur RVB du pixel

C'est facile avec OpenCV.

import cv2

img = cv2.imread('image.png')

column = 10
row = 20
pixel = img[column, row]
print(pixel)

Lorsque vous exécutez ce qui précède, la sortie sera la suivante. L'ordre est BGR, pas RVB.

>>>
[ 57  70 255]

Placez des blocs de couleur similaire

Utilisez de la laine qui peut être peinte en 16 couleurs. Les valeurs RVB pour chaque couleur sont répertoriées ci-dessous. http://minecraft.gamepedia.com/Wool

Le code pour mettre le bloc ressemble à ceci: Une fois exécuté, le bloc aux pieds du joueur deviendra orange.

from mcpi import minecraft
mc = minecraft.Minecraft.create()
x, y, z = mc.player.getPos()

wool = 35
selectedColor = 1 # Orange
mc.setBlock(x, y-1, z, wool, selectedColor)

Quant à la couleur à utiliser pour chaque pixel, trouvez la différence dans les valeurs RVB avec numpy.linalg.norm et utilisez la couleur avec la plus petite différence.

dist = numpy.linalg.norm(woolColor - pixel)

Dessiner une image en boucle

Il boucle le processus de placement de blocs de couleurs proches de la valeur RVB et convertit chaque pixel de l'image en blocs.

Le code final est ci-dessous.

minecraft.py


from mcpi import minecraft
import cv2
import numpy

mc = minecraft.Minecraft.create()

wool = 35

# wool color BGR
woolColors = [
    [221,221,221],  # 0: White
    [62,125,219], # 1: Orange
    [188,80,179], # 2: Magenta
    [201,138,107], # 3: Light blue
    [39,166,177], # 4: Yellow
    [56,174,65], # 5: Lime
    [153,132,208], # 6: Pink
    [64,64,64], # 7: Gray
    [161,161,154], # 8: Light gray
    [137,110,46], # 9: Cyan
    [181,61,126], # 10: Purple
    [141,56,46], # 11: Blue
    [31,50,79], # 12: Brown
    [27,70,53], # 13: Green
    [48,52,150], # 14: Red
    [22,22,25] # 15:Black
]

img = cv2.imread('image.png')
img = cv2.resize(img, (256, 256))

height, width = img.shape[:2]
x, y, z = mc.player.getPos()

for column in range(width):
    for row in range(height):
        pixel = img[column, row]

        selectedColor = 0
        minDist = None
        for i, woolColor in enumerate(woolColors):
            dist = numpy.linalg.norm(woolColor - pixel)
            if  minDist == None or minDist > dist:
                minDist = dist
                selectedColor = i

        mc.setBlock(-153+row, y-1, -116+column, wool, selectedColor)

mc.postToChat("Create Image")

Les coordonnées x et z sont basées sur le bord du monde, mais pour une raison quelconque, elles étaient [-153, -116]. La coordonnée y est -1 à partir de la position du joueur, et les blocs sont disposés sur le plan sur lequel le joueur se tient.

Résultat d'exécution

Avec Minecraft Pi Edition en cours d'exécution, exécutez le script Python. Vous pouvez le faire en appuyant sur la touche "F5" ou en appuyant sur "Exécuter"> "Exécuter le module".

Cela prend beaucoup de temps car 65 536 pixels sont comparés à 16 couleurs. Veuillez patienter quelques minutes.

Pour l'image originale, j'ai utilisé la tuile de carte d'OpenStreetMap (autour de la gare de Shibuya).

IMG_1436.jpg

IMG_1438.jpg

© OpenStreetMap contributors http://www.openstreetmap.org/copyright

En raison du travail de la caméra, il n'est pas possible de voir le tout en même temps. La forme de l'icône est clairement visible, mais les lettres de la note sont cassées dans la mesure où elles peuvent être lues. De plus, le gris clair et le bleu clair sont devenus des blocs blancs, et les frontières entre les bâtiments et le site ont disparu, le résultat était donc un peu subtil comme une carte.

Résumé

Je peux dessiner plus que ce à quoi je m'attendais avec une logique simple, mais j'ai l'impression que le nombre de couleurs ne suffit pas. Si vous utilisez des blocs autres que la laine et attribuez les couleurs manquantes, la qualité de l'image s'améliorera, mais cela augmentera le temps de traitement, c'est donc une pensée.

Bonus (histoire principale)

J'ai essayé des tuiles cartographiques d'une taille de 256 x 256, mais si l'image a le même nombre de pixels dans les directions verticale et horizontale, elle doit être redimensionnée avec OpenCV avant le traitement. (Je l'ai également mis dans l'exemple de code)

Ainsi, les images distribuées pour les icônes Twitter sont carrées et ont une petite résolution, n'est-ce pas?

Lisons-le correctement.

IMG_1441.jpg

IMG_1442.jpg

IMG_1443.jpg

Celui-ci peut mieux dessiner du tout!

Il n'y a pas de changement dans la tendance des zones de couleur claire telles que les cheveux et la peau à devenir des blocs blancs. Il peut être judicieux d'ajouter des blocs proches de la couleur de la peau ou du brun (grès ou argile teintée).

Recommended Posts

Bloquez et dessinez des images avec Minecraft Pi Edition
Bonjour le monde avec Raspberry Pi + Minecraft Pi Edition
Utilisez Minecraft Pi Edition à partir d'un PC
Comment dessiner une image OpenCV avec Pygame
Calculer et dessiner des diagrammes Boronoi bornés (fermés) en Python
Comprenez attentivement la distribution exponentielle et dessinez en Python
Comprendre attentivement la distribution de Poisson et dessiner en Python