web-dev-qa-db-fra.com

Comment dessiner correctement du texte chinois sur l'image en utilisant `cv2.putText`? (Python + OpenCV)

J'utilise python cv2 (window10, python2.7) pour écrire du texte dans l'image, lorsque le texte est anglais, cela fonctionne, mais lorsque j'utilise du texte chinois, il écrit du code désordonné dans l'image.

Voici mon code:

# coding=utf-8
import cv2
import numpy as np

text = "Hello world"   # just work
# text = "内容理解团队"  # messy text in the image

cv2.putText(img, text,
            cord,
            font,
            fontScale,
            fontColor,
            lineType)

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

cv2.waitKey(0)
cv2.destroyAllWindows()

Quand text = "Hello world" # just work, voici l'image de sortie:

enter image description here

Quand text = "内容理解团队" # Chinese text, draw messy text in the image, voici l'image de sortie:

enter image description here

Qu'est-ce qui ne va pas? Opencv putText ne prend-il pas en charge le texte d'une autre langue?

8
Jayhello

Le cv2.putText Ne prend pas en charge les caractères sans ascii à ma connaissance. Try to use PIL to draw NO-ASCII(such Chinese) on the image.

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

## Make canvas and set the color
img = np.zeros((200,400,3),np.uint8)
b,g,r,a = 0,255,0,0

## Use cv2.FONT_HERSHEY_XXX to write English.
text = time.strftime("%Y/%m/%d %H:%M:%S %Z", time.localtime()) 
cv2.putText(img,  text, (50,50), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (b,g,r), 1, cv2.LINE_AA)


## Use simsum.ttc to write Chinese.
fontpath = "./simsun.ttc" # <== 这里是宋体路径 
font = ImageFont.truetype(fontpath, 32)
img_pil = Image.fromarray(img)
draw = ImageDraw.Draw(img_pil)
draw.text((50, 80),  "端午节就要到了。。。", font = font, fill = (b, g, r, a))
img = np.array(img_pil)

cv2.putText(img,  "--- by Silencer", (200,150), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (b,g,r), 1, cv2.LINE_AA)


## Display 
cv2.imshow("res", img);cv2.waitKey();cv2.destroyAllWindows()
#cv2.imwrite("res.png", img)

enter image description here


Reportez-vous à ma autre réponse:

Charger la police TrueType dans OpenCV

10
Kinght 金

Selon cela forum opencv , putText ne peut prendre en charge qu'un petit sous-ensemble de caractères ascii et ne prend pas en charge les caractères unicode qui sont d'autres symboles comme les caractères chinois et arabes.

Cependant, vous pouvez essayer d'utiliser PIL à la place et suivre la réponse publiée ici et voir si cela fonctionne pour vous.

3
TMK