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:
Quand text = "内容理解团队" # Chinese text, draw messy text in the image
, voici l'image de sortie:
Qu'est-ce qui ne va pas? Opencv putText
ne prend-il pas en charge le texte d'une autre langue?
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)
Reportez-vous à ma autre réponse:
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.