So schreiben Sie mit Python opencv2 Text in ein Bild in Windows

73

Ich möchte einen Text auf ein Bild setzen. Ich schreibe den Code wie folgt:

cv2.putText(image,"Hello World!!!", (x,y), cv2.CV_FONT_HERSHEY_SIMPLEX, 2, 255)

Es gibt ERROR und sagt, dass das Objekt 'module' kein Attribut 'CV_FONT_HERSHEY_SIMPLEX' hat.

Abfrage Kann ich den Schrifttyp nicht wie oben verwenden? Ich habe im Internet gesucht, aber nur die Syntax für Opencv C ++ für initFont gefunden. Dann dachte ich daran putText, den Schrifttyp als Parameter zu übergeben. Aber es funktioniert nicht bei mir.

Irgendwelche Vorschläge?

Chandra Shaker Balure
quelle

Antworten:

116

Dieser Code verwendet cv2.putText, um Text auf einem Bild zu überlagern. Sie müssen NumPy und OpenCV installiert haben.

import numpy as np
import cv2

# Create a black image
img = np.zeros((512,512,3), np.uint8)

# Write some Text

font                   = cv2.FONT_HERSHEY_SIMPLEX
bottomLeftCornerOfText = (10,500)
fontScale              = 1
fontColor              = (255,255,255)
lineType               = 2

cv2.putText(img,'Hello World!', 
    bottomLeftCornerOfText, 
    font, 
    fontScale,
    fontColor,
    lineType)

#Display the image
cv2.imshow("img",img)

#Save image
cv2.imwrite("out.jpg", img)

cv2.waitKey(0)
Vinay Vemula
quelle
18
Es kann nützlich sein, die Größe des geschriebenen Textes zu kennen:text_width, text_height = cv2.getTextSize(text_description, font, fontScale, lineType)[0]
João Cartucho
3
Hier lineTypesollte sein, lineThicknessda dies die Parameterliste ist. Siehe: docs.opencv.org/2.4/modules/core/doc/…
Alan Turing
32

War CV_FONT_HERSHEY_SIMPLEXin Lebenslauf (1)? Hier ist alles, was ich für cv2 "FONT" zur Verfügung habe:

FONT_HERSHEY_COMPLEX
FONT_HERSHEY_COMPLEX_SMALL
FONT_HERSHEY_DUPLEX
FONT_HERSHEY_PLAIN
FONT_HERSHEY_SCRIPT_COMPLEX
FONT_HERSHEY_SCRIPT_SIMPLEX
FONT_HERSHEY_SIMPLEX
FONT_HERSHEY_TRIPLEX
FONT_ITALIC

Das Löschen des 'CV_' scheint für mich zu funktionieren.

cv2.putText(image,"Hello World!!!", (x,y), cv2.FONT_HERSHEY_SIMPLEX, 2, 255)
Andenthal
quelle
2
Wie haben Sie die Liste der verfügbaren Schriftarten erhalten?
Craig S. Anderson
3
@ CraigS.Anderson Mein Ansatz dafür ist normalerweise nur an der Python-Eingabeaufforderung, wie folgt:import cv2; [x for x in dir(cv2) if x.startswith('FONT_')]
Peter Hansen
10

Dies ist in der Tat ein ärgerliches Problem. Für Python 2.xx verwenden Sie:

cv2.CV_FONT_HERSHEY_SIMPLEX

und für Python 3.xx:

cv2.FONT_HERSHEY_SIMPLEX

Ich empfehle die Verwendung einer Autocomplete-Umgebung (z. B. Pyscripter oder Scipy). Wenn Sie nach Beispielcode suchen, stellen Sie sicher, dass sie dieselbe Version von Python verwenden (wenn sie nicht sicherstellen, dass Sie den Code ändern).

Roeffus
quelle
10

Ich hatte ein ähnliches Problem. Ich würde vorschlagen, die PILBibliothek in Python zu verwenden, da sie den Text in einer bestimmten Schriftart zeichnet, im Vergleich zu eingeschränkten Schriftarten in OpenCV. Mit PIL können Sie eine beliebige auf Ihrem System installierte Schriftart auswählen.

from PIL import ImageFont, ImageDraw, Image
import numpy as np
import cv2

image = cv2.imread("lena.png")

# Convert to PIL Image
cv2_im_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
pil_im = Image.fromarray(cv2_im_rgb)

draw = ImageDraw.Draw(pil_im)

# Choose a font
font = ImageFont.truetype("Roboto-Regular.ttf", 50)

# Draw the text
draw.text((0, 0), "Your Text Here", font=font)

# Save the image
cv2_im_processed = cv2.cvtColor(np.array(pil_im), cv2.COLOR_RGB2BGR)
cv2.imwrite("result.png", cv2_im_processed)

result.png

DollarAkshay
quelle
1
Obwohl Ihre Lösung anscheinend funktioniert, beantwortet sie meiner Meinung nach nicht die Frage, die angibt, dass Opencv verwendet wird.
Joseph Budin
3

Ich weiß, dass dies eine wirklich alte Frage ist, aber ich denke, ich habe eine Lösung. In den neueren Versionen von openCV werden Schriftarten durch eine Zahl wie diese dargestellt

    FONT_HERSHEY_SIMPLEX = 0,
    FONT_HERSHEY_PLAIN = 1,
    FONT_HERSHEY_DUPLEX = 2,
    FONT_HERSHEY_COMPLEX = 3,
    FONT_HERSHEY_TRIPLEX = 4,
    FONT_HERSHEY_COMPLEX_SMALL = 5,
    FONT_HERSHEY_SCRIPT_SIMPLEX = 6,
    FONT_HERSHEY_SCRIPT_COMPLEX = 7,
    FONT_ITALIC = 16

Sie müssen also nur den Schriftnamen durch die entsprechende Nummer ersetzen

cv2.putText(image,"Hello World!!!", (x,y), 0, 2, 255)

wieder weiß ich, dass es eine alte Frage ist, aber es kann jemandem in der Zukunft helfen

Gerard Garvey
quelle
1

Hier ist der Code mit Parameterbezeichnungen

def draw_text(self, frame, text, x, y, color=BGR_COMMON['green'], thickness=1.3, size=0.3,):
    if x is not None and y is not None:
        cv2.putText(
            frame, text, (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, size, color, thickness)

Den Namen der Schriftart finden Sie in einer anderen Antwort in diesem Thread.

Auszug aus der Antwort von @Roeffus

Dies ist in der Tat ein ärgerliches Problem. Für Python 2.xx verwenden Sie:

cv2.CV_FONT_HERSHEY_SIMPLEX und für Python 3.xx:

cv2.FONT_HERSHEY_SIMPLEX

Weitere Informationen finden Sie unter http://www.programcreek.com/python/example/83399/cv2.putText

Ravinder Payal
quelle
Sie können die Bibliothek PILasOPENCV verwenden github.com/bunkahle/PILasOPENCV , die ein Wrapper um gemeinsame PIL Funktionen ist aber intern verwendet nur OpenCV
Bunkus
1

Sie können cv2.FONT_HERSHEY_SIMPLEX anstelle von cv2.CV_FONT_HERSHEY_SIMPLEX in der aktuellen opencv-Version verwenden

Ajai
quelle
-1

Für das obige Beispiel würde die Lösung folgendermaßen aussehen:

import PILasOPENCV as Image
import PILasOPENCV as ImageDraw
import PILasOPENCV as ImageFont
# from PIL import ImageFont, ImageDraw, Image
import numpy as np
import cv2

image = cv2.imread("lena.jpg")

# Convert to PIL Image
cv2_im_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
pil_im = Image.fromarray(cv2_im_rgb)

draw = ImageDraw.Draw(pil_im)

# Choose a font
font = ImageFont.truetype("Roboto-Regular.ttf", 40)

# Draw the text
draw.text((0, 0), "Your Text Here", font=font)

# Save the image
cv2_im_processed = pil_im.getim()
cv2.imshow("cv2_im_processed", cv2_im_processed)
cv2.waitKey()
Bunkus
quelle