web-dev-qa-db-ja.com

`cv2.putText`を正しく使用して画像に中国語のテキストを描画する方法は? (Python + OpenCV)

python cv2(window10、python2.7)を使用してテキストを画像に書き込みます。テキストが英語の場合は動作しますが、中国語のテキストを使用する場合は画像に乱雑なコードを書き込みます。

以下は私のコードです:

# 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()

いつ text = "Hello world" # just work、以下は出力イメージです。

enter image description here

いつ text = "内容理解团队" # Chinese text, draw messy text in the image、以下は出力イメージです。

enter image description here

どうしましたか? opencv putTextは他の言語のテキストをサポートしていませんか?

8
Jayhello

_cv2.putText_は、私の知る限りno-ascii charをサポートしていません。 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


私の別の答えを参照してください:

OpenTypeにTrueTypeフォントを読み込む

10
Kinght 金

この opencv forum によると、putTextは文字の小さなASCIIサブセットのみをサポートでき、中国語やアラビア語のような他の記号であるUnicode文字はサポートしていません。

ただし、代わりにPILを使用して、投稿された答え here をたどり、うまくいくかどうかを確認できます。

3
TMK