Si vous faites un papier de mise en conserve, vous le comprendrez dans le processus. Ceci est un article pour moi. J'avais l'intention d'écrire un article spécialisé dans OpenCV, mais pour une raison quelconque, j'ai dû également écrire sur PIL. Certains arguments sont omis.
OpenCV
Comme les données d'image d'OpenCV sont un tableau numpy, vous pouvez créer une image monochrome avec np.full (). Dans le cas d'un fond noir, une description plus simple peut être faite, mais il ne suffit pas de s'en souvenir individuellement, elle est donc omise.
(hauteur, largeur, 3)
.(b, g, r)
.dtype = numpy.uint8
.La fonction suivante traite l'image spécifiée. Qu'est-ce que ça veut dire?
img = cv2.line(img, ...)
Et la valeur de retour n'a pas à être réaffectée à elle-même
cv2.line(img, ...)
La valeur de ʻimgchange simplement en écrivant. Si vous ne souhaitez pas que cela se produise, vous devez copier l'image d'origine en tant qu'objet distinct. C'est pourquoi j'ai mis ʻimg_rect = img_origin.copy ()
dans cet article.
(x, y)
. entier. C'est possible en dehors de l'image.(x, y)
. entier. C'est possible en dehors de l'image.Utilisez cv2.ellipse () pour dessiner un arc.
(x, y)
. entier.(x, y)
. entier.L'angle peut être un petit nombre. De plus, le sens de rotation de l'axe x à l'axe y est positif. Les coordonnées mathématiques xy sont dans le sens antihoraire, mais dans le système de coordonnées de l'ordinateur, l'axe y est vers le bas, donc le sens antihoraire est positif. En d'autres termes, ce genre de chose.
Eh bien, même si j'écris jusqu'à présent, je ne l'utiliserai pas de toute façon.
np.array ([(x1, y1), (x2, y2), ...])
, et il est entouré de crochets pour faire une liste. Même lorsque vous dessinez un polygone, il s'agit d'une liste avec un élément.Écrire * pts * est compliqué, mais vous devez le maîtriser pour jouer avec la détection de contour, alors faisons de notre mieux pour nous en souvenir. Dans l'exemple de programme ci-dessous, une fonction personnalisée est intégrée pour dessiner plusieurs fois la même figure. Avez-vous été arrêté par la police du PEP si vous utilisiez l'espace pour les aligner?
polylines_test.py
import numpy as np
import cv2
###Fonction pour décaler les coordonnées
# [(x1,y1), (x2,y2)]Quand(a,b)De[(x1+a,y1+b), (x2+a, y2+b)]faire
def position_offset(pos, offset):
np_newpos = np.array(pos) + np.array(offset)
list_newpos = list(map(tuple, np_newpos.tolist()))
return list_newpos
###Créer une image monochromatique de base
imgCV = np.full((180,200,3), (128,128,128), dtype = np.uint8)
###Faire 3 mêmes lignes de pliage
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))
###Dessinez un polygone
#Dessinez un polygone
cv2.polylines(imgCV, [pts1] , True, (255,0,0), 3)
#Dessinez plusieurs polygones à la fois
cv2.polylines(imgCV, [pts2, pts3], True, (0,0,255), 3)
cv2.imshow("polylines", imgCV)
cv2.waitKey(0)
cv2.destroyAllWindows()
Le résultat est le suivant.
Remplissez avec précision les polygones avec des renfoncements. Wikipedia contient un élément appelé Concave Square Dans l'encyclopédie pour enfants que j'ai lue il y a longtemps, elle s'appelait "Arrow's Negata".
Si vous savez qu'il s'agit d'un polygone convexe, il est plus rapide de l'utiliser. Si vous l'utilisez avec un polygone concave, cela ne provoquera pas d'erreur, mais laissera des zones non peintes.
(x, y)
.Les 8 types suivants peuvent être utilisés. HERSHEY n'est pas un chocolat, mais une police vectorielle développée par le Dr Hercy.
En combinant ceci avec cv2.FONT_ITALIC (car c'est une constante intégrée, ajoutez-la), elle peut être rendue oblique.
Utilisez cette fonction lorsque vous souhaitez placer le texte au centre de la figure.
Il y a deux sorties. La taille du texte représenté par (largeur, hauteur)
et la coordonnée y de la ligne de base vue depuis le point le plus bas de la chaîne. Ce dernier est celui qui apparaît ci-dessous comme "y" et "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]
#Créer une image monochromatique de base
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)
#Ligne de base inutilisée
(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()
La colonne centrale est une police normale et la colonne de droite est une police italique. La gauche est un composite des deux. Certaines polices n'ont pas l'effet italique.
PIL
(largeur, hauteur)
.mode =" RGB "
, spécifiez avec (r, g, b)
. Non requis, la valeur par défaut est le noir.Pour dessiner une figure sur une image, créez un objet ImageDraw.Draw au lieu de l'image elle-même et dessinez dessus.
[(x1, y1), (x2, y2), ...]
ou [x1, y1, x2, y2, ...]
dans la liste.Probablement un bug, mais lors de l'utilisation de joint =" curve "
, la description du groupe de coordonnées doit êtrexy = [(x1, y1), (x2, y2), ...]
. Si xy = [x1, y1, x2, y2, ...]
, une erreur se produira. De plus, si vous tracez une ligne de pliage avec la couleur par défaut sans définir * remplissage *, le traitement de la courbe sera à mi-chemin.
[(x0, y0), (x1, y1)]
ou [x0, y0, x1, y1]
dans la liste.[(x0, y0), (x1, y1)]
ou [x0, y0, x1, y1]
dans la liste. Une image d'un cercle (ovale) inscrit dans un carré. À ce stade, x0 <= x1 et y0 <= y1 doivent être satisfaits.Je me demandais pourquoi il avait de telles spécifications, mais quand j'y ai pensé, il y avait beaucoup de logiciels de dessin avec de telles spécifications.
Si vous connaissez la ligne et le rectangle, vous pouvez le maîtriser. Pour le moment, la largeur de ligne ne peut pas être spécifiée et est fixée à 1.
PIL.ImageDraw.ImageDraw.point (* xy *, * fill ) au point (multiple) points ImageDraw.arc ( xy *, * début *, * fin *, * remplissage *, * largeur ) ImageDraw.chord ( xy *, * début *, * fin *, * remplissage *, * contour *, * largeur ) ImageDraw.pieslice ( xy *, * start *, * end *, * fill *, * outline *, * width *) peut être utilisé pour dessiner une forme en éventail (arc + rayon). L'unité d'angle est le degré, qui augmente dans le sens des aiguilles d'une montre à partir de 3 heures comme cv2.ellipse () d'OpenCV.
La méthode de dessin des caractères PIL utilise la police du PC, donc le japonais peut également être utilisé.
(x, y)
.Contrairement à cv2.getTextSize (), la sortie est uniquement (largeur, hauteur)
.
C'est devenu beaucoup de choses. Ici aussi, la fonction auto-créée position_offset () est utilisée.
PIL_test.py
import numpy as np
from PIL import Image, ImageDraw, ImageFont
###Fonction pour décaler les coordonnées
# [(x1,y1), (x2,y2)]Quand(a,b)De[(x1+a,y1+b), (x2+a, y2+b)]faire
def position_offset(pos, offset):
np_newpos = np.array(pos) + np.array(offset)
list_newpos = list(map(tuple, np_newpos.tolist()))
return list_newpos
###Créer une image monochromatique de base
imgPIL = Image.new("RGB", (640,480), (128,128,128))
###Créer un objet Draw
draw = ImageDraw.Draw(imgPIL)
###Ligne brisée
pos = [(10,10), (80,60), (80,10), (60,30)]
### line
for i in range(6):
# y=0 : joint =Ligne pliée lorsque Aucun est défini et que le remplissage est omis.
draw.line(xy = position_offset(pos,(100*i,0)),
width = i*5,
joint = None)
# y=100 : joint = "curve"Ligne pliée quand
draw.line(xy = position_offset(pos,(100*i,100)),
fill = (0,255,255),
width = i*5,
joint = "curve")
# y=Extrémité droite de 200:joint sans spécifier de remplissage= "curve"Comportement quand
#Il n'est pas nécessaire qu'il soit à l'intérieur de la boucle for, mais je l'ai mis ici pour faciliter la comparaison.
draw.line(xy = position_offset(pos,(100*5,200)),
width = 25,
joint = "curve")
###Même si le même groupe de coordonnées que la ligne de polygone est utilisé, il devient un polygone fermé.
#Spécifier le remplissage
draw.polygon(xy = position_offset(pos,(0,200)),
fill = (255,0,0))
#Spécifier le contour
draw.polygon(xy = position_offset(pos,(100,200)),
outline = (0,255,0))
#Spécifier le remplissage et le contour
draw.polygon(xy = position_offset(pos,(200,200)),
fill = (255,0,0),
outline = (0,255,0))
###rectangle et ellipse
pos=[(10,0), (200,70)] #Changeons l'ordre des deux points
for i in range(3):
draw.rectangle(xy = position_offset(pos,(200*i,300)),
fill = None,
outline = (0,0,255),
width = i*5) #la largeur peut être 1 même si elle vaut 0
draw.ellipse(xy = position_offset(pos,(200*i,300)),
fill = (255,255,0),
outline = (0,255,0),
width = i*5)
###arc, accord et pieslice
start, end = 45, 300
#arc Le contour de l'arc est abrégé
draw.arc(xy = position_offset(pos,(0,400)),
start = start,
end = end,
width = 4)
#corde d'accord
draw.chord(xy = position_offset(pos,(200,400)),
start = start,
end = end,
fill = (255,0,0),
outline = (0,255,0))
#pieslice en forme d'éventail
draw.pieslice(xy = position_offset(pos,(400,400)),
start = start,
end = end,
fill = (255,0,0),
outline = (0,255,0))
###Dessiner des lettres
#Dessinez des personnages avec des paramètres minimaux
draw.text(xy = (520,190),
text = "bug? -> ")
#Dessiner des caractères dans la police spécifiée
#La police était DF Reiga Song
font = ImageFont.truetype(font="Dflgs9.TTC",
size=30)
draw.text(xy = (440,250),
text = "punaise? →",
fill = (0,0,0),
font = font)
###Afficher l'image
imgPIL.show()
Le résultat est le suivant.
Merci à teratail d'avoir créé ma propre fonction position_offset (). Merci beaucoup. https://teratail.com/questions/234513
Je veux afficher le japonais dans OpenCV. À cette fin, le PIL ne devrait être utilisé que pour cette partie. Il existe de nombreux articles de ce type sur le Web, mais je ne suis pas satisfait d'eux. Je ne vais pas renvoyer mes ancêtres, mais je veux créer une fonction plus pratique.
Recommended Posts