[PYTHON] Blockieren und zeichnen Sie Bilder mit Minecraft Pi Edition

Ich habe bei vorheriger Artikel eine Raspeltorte gekauft und habe bisher nur Bluetooth verwendet, aber ich habe es bemerkt. Ja, Minecraft ist auf Raspbian installiert!

Ich wollte Micra ausprobieren, also werde ich ein bisschen spielen.

Minecraft Pi Edition Ich habe eine Übersichtsseite gefunden. https://matome.naver.jp/m/odai/2142545327953860701

Die Funktionen der Pi Edition sind wie folgt.

Es scheint einen inoffiziellen Patch zu geben, der den Überlebensmodus ermöglicht. Die Größe des Flugzeugs beträgt nur 256 x 256. Wenn Sie also ernsthaft programmieren und spielen und es tun möchten, können Sie die PC-Version kaufen.

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

Was zu machen

Die Kartenkachel, die Ihnen einfällt, wenn Sie 256 x 256 hören! (Berufskrankheit) https://en.m.wikipedia.org/wiki/Tiled_web_map

Zeichnen wir als Test eine Kartenkachel.

Was ich benutzt habe

Ich wusste nicht, ob ich Python3 verwenden könnte, also entschied ich mich für Python2.

Implementierung

Lesen Sie das Bild mit OpenCV, überprüfen Sie den RGB-Wert jedes Pixels und platzieren Sie Blöcke in der Nähe dieser Farbe.

OpenCV-Installation

Ich konnte es installieren, indem ich die Schritte im folgenden Artikel befolgte. http://qiita.com/suppy193/items/91609e75789e9f458c39

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

Laden Sie das Bild und erhalten Sie den RGB-Wert des Pixels

Mit OpenCV ist das ganz einfach.

import cv2

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

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

Wenn Sie die obigen Schritte ausführen, lautet die Ausgabe wie folgt. Die Reihenfolge ist BGR, nicht RGB.

>>>
[ 57  70 255]

Platziere Blöcke ähnlicher Farbe

Verwenden Sie Wolle, die in 16 Farben bemalt werden kann. Die RGB-Werte für jede Farbe sind unten aufgeführt. http://minecraft.gamepedia.com/Wool

Der Code zum Einfügen des Blocks sieht folgendermaßen aus: Bei der Ausführung wird der Block zu Füßen des Spielers 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)

Welche Farbe für jedes Pixel verwendet werden soll, ermitteln Sie den Unterschied in den RGB-Werten mit "numpy.linalg.norm" und verwenden Sie die Farbe mit dem geringsten Unterschied.

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

Zeichnen Sie ein Bild in einer Schleife

Der Prozess des Platzierens von Farbblöcken in der Nähe des RGB-Werts wird wiederholt und jedes Pixel des Bildes wird in Blöcke konvertiert.

Der endgültige Code ist unten.

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")

Die x- und z-Koordinaten basieren auf dem Rand der Welt, aber aus irgendeinem Grund war es [-153, -116]. Die y-Koordinate ist -1 von der Position des Spielers entfernt, und die Blöcke sind in der Ebene angeordnet, auf der der Spieler steht.

Ausführungsergebnis

Führen Sie bei laufender Minecraft Pi Edition das Python-Skript aus. Sie können dies tun, indem Sie die Taste "F5" drücken oder "Run"> "Module ausführen" drücken.

Dies nimmt viel Zeit in Anspruch, da 65.536 Pixel mit 16 Farben verglichen werden. Bitte warten Sie geduldig einige Minuten.

Für das Originalbild habe ich die Kartenkachel von OpenStreetMap (um die Shibuya Station herum) verwendet.

IMG_1436.jpg

IMG_1438.jpg

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

Aufgrund der Kameraarbeit ist es nicht möglich, das Ganze auf einmal zu sehen. Die Form des Symbols ist deutlich sichtbar, aber die Buchstaben in der Notiz sind so weit gebrochen, dass sie gelesen werden können. Außerdem wurden Hellgrau und Hellblau zu weißen Blöcken, und die Grenzen zwischen den Gebäuden und dem Standort verschwanden, sodass das Ergebnis als Karte etwas subtil war.

Zusammenfassung

Ich kann mit einfacher Logik mehr zeichnen, als ich erwartet hatte, aber ich habe den Eindruck, dass die Anzahl der Farben nicht ausreicht. Wenn Sie andere Blöcke als Wolle verwenden und die fehlenden Farben zuweisen, verbessert sich die Bildqualität, erhöht jedoch die Verarbeitungszeit, sodass dies ein Gedanke ist.

Bonus (Hauptgeschichte)

Ich habe versucht, Kartenkacheln mit einer Größe von 256 x 256 zu erstellen. Wenn das Bild jedoch in vertikaler und horizontaler Richtung die gleiche Anzahl von Pixeln aufweist, sollte die Größe vor der Verarbeitung mit OpenCV geändert werden. (Ich habe es auch in das Codebeispiel eingefügt)

Die für Twitter-Symbole verteilten Bilder sind also quadratisch und haben eine geringe Auflösung, nicht wahr?

Lass es uns angemessen lesen.

IMG_1441.jpg

IMG_1442.jpg

IMG_1443.jpg

Dieser kann überhaupt besser zeichnen!

Die Tendenz, dass helle Bereiche wie Haare und Haut zu weißen Blöcken werden, ändert sich nicht. Es kann eine gute Idee sein, Blöcke hinzuzufügen, die nahe an der Hautfarbe oder braun sind (Sandstein oder gebeizter Ton).

Recommended Posts

Blockieren und zeichnen Sie Bilder mit Minecraft Pi Edition
Hallo Welt mit Raspberry Pi + Minecraft Pi Edition
Bedienen Sie Minecraft Pi Edition von einem PC aus
So zeichnen Sie ein OpenCV-Bild mit Pygame
Berechnen und zeichnen Sie begrenzte (geschlossene) Boronoi-Diagramme in Python
Verstehen Sie die Exponentialverteilung sorgfältig und zeichnen Sie in Python
Verstehe die Poisson-Distribution sorgfältig und zeichne in Python