Wenn Sie ein Konservenpapier herstellen, werden Sie es dabei verstehen. Dies ist ein Artikel für mich. Ich wollte einen Artikel schreiben, der sich auf OpenCV spezialisiert hat, aber aus irgendeinem Grund musste ich auch über PIL schreiben. Einige Argumente werden weggelassen.
OpenCV
Da die Bilddaten von OpenCV ein Numpy-Array sind, können Sie mit np.full () ein monochromes Bild erstellen. Im Falle eines schwarzen Hintergrunds kann ich etwas einfacher schreiben, aber ich werde es weglassen, weil es nicht ausreicht, sich einzeln zu erinnern.
(Höhe, Breite, 3)
.(b, g, r)
.Die folgende Funktion verarbeitet das angegebene Bild. Was bedeutet das?
img = cv2.line(img, ...)
Und der Rückgabewert muss nicht selbst neu zugewiesen werden
cv2.line(img, ...)
Der Wert von "img" ändert sich nur durch Schreiben. Wenn Sie dies nicht möchten, müssen Sie das Originalbild als separates Objekt kopieren. Aus diesem Grund habe ich in diesem Artikel "img_rect = img_origin.copy ()" festgelegt.
(x, y)
an. ganze Zahl. Es ist außerhalb des Bildes möglich.(x, y)
an. ganze Zahl. Es ist außerhalb des Bildes möglich.Verwenden Sie cv2.ellipse (), um einen Bogen zu zeichnen.
(x, y)
an. ganze Zahl.(x, y)
an. ganze Zahl.angle = 0
und a> b ist, dann ist es eine horizontal lange Ellipse.Der Winkel kann eine kleine Zahl sein. Außerdem ist die Drehrichtung von der x-Achse zur y-Achse positiv. Mathematische xy-Koordinaten sind gegen den Uhrzeigersinn, aber im Computerkoordinatensystem ist die y-Achse nach unten gerichtet, sodass sie gegen den Uhrzeigersinn positiv ist. Mit anderen Worten, so etwas.
Nun, selbst wenn ich bisher schreibe, werde ich es sowieso nicht benutzen.
Das Schreiben von * pts * ist kompliziert, aber Sie müssen es beherrschen, um mit der Konturerkennung zu spielen. Lassen Sie uns also unser Bestes tun, um uns daran zu erinnern. Im folgenden Beispielprogramm ist eine selbst erstellte Funktion enthalten, mit der dieselbe Figur mehrmals gezeichnet werden kann. Wurden Sie von der PEP-Polizei verhaftet, wenn Sie den Raum genutzt haben, um sie auszurichten?
polylines_test.py
import numpy as np
import cv2
###Funktion zum Versetzen der Koordinaten
# [(x1,y1), (x2,y2)]Wann(a,b)Von[(x1+a,y1+b), (x2+a, y2+b)]machen
def position_offset(pos, offset):
np_newpos = np.array(pos) + np.array(offset)
list_newpos = list(map(tuple, np_newpos.tolist()))
return list_newpos
###Erstellen Sie ein monochromatisches Basisbild
imgCV = np.full((180,200,3), (128,128,128), dtype = np.uint8)
###Machen Sie 3 gleiche Faltlinien
pos = [(10,10), (80,60), (80,10), (60,30)]
offset1 = ( 0, 0)
offset2 = (100, 40)
offset3 = (100,100)
pts1 = np.array(position_offset(pos, offset1))
pts2 = np.array(position_offset(pos, offset2))
pts3 = np.array(position_offset(pos, offset3))
###Zeichnen Sie ein Polygon
#Zeichnen Sie ein Polygon
cv2.polylines(imgCV, [pts1] , True, (255,0,0), 3)
#Zeichnen Sie mehrere Polygone gleichzeitig
cv2.polylines(imgCV, [pts2, pts3], True, (0,0,255), 3)
cv2.imshow("polylines", imgCV)
cv2.waitKey(0)
cv2.destroyAllWindows()
Das Ergebnis ist dies.
Füllen Sie Polygone genau mit Aussparungen. Wikipedia hat einen Artikel namens Concave Square In der Enzyklopädie für Kinder, die ich vor langer Zeit gelesen habe, hieß sie "Arrow's Negata".
Wenn Sie wissen, dass es sich um ein konvexes Polygon handelt, können Sie es schneller verwenden. Wenn Sie dies mit einem konkaven Polygon verwenden, wird kein Fehler verursacht, es bleiben jedoch unbemalte Bereiche zurück.
(x, y)
an.Die folgenden 8 Typen können verwendet werden. HERSHEY ist keine Schokolade, sondern eine von Dr. Hercy entwickelte Vektorschrift.
Durch Kombinieren mit cv2.FONT_ITALIC (da es sich um eine integrierte Konstante handelt, fügen Sie sie hinzu) kann es schräg gestellt werden.
Verwenden Sie diese Funktion, wenn Sie den Text in der Mitte der Abbildung platzieren möchten. Es gibt zwei Ausgänge. Die Größe des durch "(Breite, Höhe)" dargestellten Textes und die y-Koordinate der Grundlinie vom niedrigsten Punkt der Zeichenfolge aus gesehen. Letzteres ist dasjenige, das unten herausspringt, wie "y" und "p".
putText_test.py
import numpy as np
import cv2
fonts=[cv2.FONT_HERSHEY_SIMPLEX,
cv2.FONT_HERSHEY_PLAIN,
cv2.FONT_HERSHEY_DUPLEX,
cv2.FONT_HERSHEY_COMPLEX,
cv2.FONT_HERSHEY_TRIPLEX,
cv2.FONT_HERSHEY_COMPLEX_SMALL,
cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,
cv2.FONT_HERSHEY_SCRIPT_COMPLEX]
#Erstellen Sie ein monochromatisches Basisbild
img = np.full((360,600,3), (255,255,255), dtype = np.uint8)
for i, font in enumerate(fonts):
for j in range(2):
for k in range(2):
x, y = 200*(j+1)*k+10, i*40+50
fnt = font if j == 0 else font + cv2.FONT_ITALIC
text = "sample_{}".format(fnt)
cv2.putText(img,
text = text,
org = (x, y),
fontFace = fnt,
fontScale = 1,
color = (0, 0, 255*j),
thickness=1)
#Basislinie unbenutzt
(w, h), _ = cv2.getTextSize(text = text,
fontFace = fnt,
fontScale = 1,
thickness = 1)
cv2.rectangle(img, (x, y), (x+w, y-h), (255, 0, 0))
cv2.circle(img, (x, y), 3, (255, 0, 0))
cv2.imshow("hershey fonts",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Die mittlere Spalte ist eine normale Schriftart und die rechte Spalte ist kursiv. Die linke ist eine Zusammensetzung der beiden. Es gibt einige Schriftarten, die nicht kursiv wirken.
PIL
(Breite, Höhe)
an.mode =" RGB "
, geben Sie mit(r, g, b)
an. Nicht erforderlich, Standardwert ist schwarz.Um eine Figur auf ein Bild zu zeichnen, erstellen Sie ein ImageDraw.Draw-Objekt anstelle des Bildes selbst und zeichnen Sie darauf.
Wahrscheinlich ein Fehler, aber bei Verwendung von "Joint =" Kurve "" muss die Beschreibung der Koordinatengruppe "xy = [(x1, y1), (x2, y2), ...]" sein. Wenn "xy = [x1, y1, x2, y2, ...]", tritt ein Fehler auf. Wenn Sie eine Faltlinie mit der Standardfarbe zeichnen, ohne * füllen * zu setzen, ist die Kurvenverarbeitung zur Hälfte abgeschlossen.
Ich habe mich gefragt, warum es solche Spezifikationen hat, aber als ich darüber nachdachte, gab es viele Zeichensoftware mit solchen Spezifikationen.
Wenn Sie die Linie und das Rechteck kennen, können Sie es beherrschen. Derzeit kann die Linienbreite nicht angegeben werden und ist auf 1 festgelegt.
PIL.ImageDraw.ImageDraw.point (* xy *, * fill ), um (mehrere) Punkte zu zeigen ImageDraw.arc ( xy *, * start *, * end *, * fill *, * width ) ImageDraw.chord ( xy *, * start *, * end *, * fill *, * umriss *, * width ) ImageDraw.pieslice ( xy *, * Start *, * Ende *, * Füllung *, * Umriss *, * Breite *) kann zum Zeichnen einer Fächerform (Bogen + Radius) verwendet werden. Die Winkeleinheit ist Grad, die wie cv2.ellipse () von OpenCV ab 3 Uhr im Uhrzeigersinn zunimmt.
Die Methode zum Zeichnen von PIL-Zeichen verwendet die Schriftart auf dem PC, sodass auch Japanisch verwendet werden kann.
(x, y)
an.\ n
sind ebenfalls in Ordnung.Im Gegensatz zu cv2.getTextSize () ist die Ausgabe nur "(Breite, Höhe)".
Es ist eine Menge Dinge geworden. Auch hier wird die selbst erstellte Funktion position_offset () verwendet.
PIL_test.py
import numpy as np
from PIL import Image, ImageDraw, ImageFont
###Funktion zum Versetzen der Koordinaten
# [(x1,y1), (x2,y2)]Wann(a,b)Von[(x1+a,y1+b), (x2+a, y2+b)]machen
def position_offset(pos, offset):
np_newpos = np.array(pos) + np.array(offset)
list_newpos = list(map(tuple, np_newpos.tolist()))
return list_newpos
###Erstellen Sie ein monochromatisches Basisbild
imgPIL = Image.new("RGB", (640,480), (128,128,128))
###Erstellen Sie ein Draw-Objekt
draw = ImageDraw.Draw(imgPIL)
###Gestrichelten Linie
pos = [(10,10), (80,60), (80,10), (60,30)]
### line
for i in range(6):
# y=0 : joint =Gefaltete Linie, wenn Keine eingestellt ist und die Füllung weggelassen wird.
draw.line(xy = position_offset(pos,(100*i,0)),
width = i*5,
joint = None)
# y=100 : joint = "curve"Gebogene Linie wenn
draw.line(xy = position_offset(pos,(100*i,100)),
fill = (0,255,255),
width = i*5,
joint = "curve")
# y=Rechtes Ende von 200:Verbindung ohne Angabe der Füllung= "curve"Verhalten wenn
#Es muss sich nicht in der for-Schleife befinden, aber ich habe es hier eingefügt, um den Vergleich zu erleichtern.
draw.line(xy = position_offset(pos,(100*5,200)),
width = 25,
joint = "curve")
###Selbst wenn dieselbe Koordinatengruppe wie die Polygonlinie verwendet wird, wird sie zu einem geschlossenen Polygon.
#Geben Sie die Füllung an
draw.polygon(xy = position_offset(pos,(0,200)),
fill = (255,0,0))
#Gliederung angeben
draw.polygon(xy = position_offset(pos,(100,200)),
outline = (0,255,0))
#Geben Sie Füllung und Gliederung an
draw.polygon(xy = position_offset(pos,(200,200)),
fill = (255,0,0),
outline = (0,255,0))
###Rechteck und Ellipse
pos=[(10,0), (200,70)] #Lassen Sie uns die Reihenfolge der beiden Punkte ändern
for i in range(3):
draw.rectangle(xy = position_offset(pos,(200*i,300)),
fill = None,
outline = (0,0,255),
width = i*5) #width kann 1 sein, auch wenn es 0 ist
draw.ellipse(xy = position_offset(pos,(200*i,300)),
fill = (255,255,0),
outline = (0,255,0),
width = i*5)
###Bogen, Akkord und Pieslice
start, end = 45, 300
#Bogen Bogenumriss wird abgekürzt
draw.arc(xy = position_offset(pos,(0,400)),
start = start,
end = end,
width = 4)
#Akkordfolge
draw.chord(xy = position_offset(pos,(200,400)),
start = start,
end = end,
fill = (255,0,0),
outline = (0,255,0))
#Pieslice fächerförmig
draw.pieslice(xy = position_offset(pos,(400,400)),
start = start,
end = end,
fill = (255,0,0),
outline = (0,255,0))
###Buchstaben zeichnen
#Zeichnen Sie Zeichen mit minimalen Einstellungen
draw.text(xy = (520,190),
text = "bug? -> ")
#Zeichnen Sie Zeichen in der angegebenen Schriftart
#Die Schriftart war DF Reiga Song
font = ImageFont.truetype(font="Dflgs9.TTC",
size=30)
draw.text(xy = (440,250),
text = "Fehler? →",
fill = (0,0,0),
font = font)
###Bild anzeigen
imgPIL.show()
Das Ergebnis ist dies.
Vielen Dank an teratail für die Erstellung meiner eigenen Funktion position_offset (). Vielen Dank. https://teratail.com/questions/234513
Ich möchte Japanisch in OpenCV anzeigen. Zu diesem Zweck sollte PIL nur für diesen Teil verwendet werden. Es gibt viele solcher Artikel im Internet, aber ich bin nicht zufrieden mit ihnen. Ich werde meine Vorfahren nicht entlassen, aber ich möchte eine praktischere Funktion schaffen.
Recommended Posts