如何正确使用“cv2.putText”在图像上绘制阿拉伯文本?(Python+OpenCV)

OMR*_*RAN 4 opencv arabic python-3.x

我使用 python cv2(window10, python3.6) 在图像中写入文本,当文本是英文时它可以工作,但是当我使用阿拉伯文本时它会在图像中写入混乱的代码。

\n\n

下面是我的代码:

\n\n
import cv2 \nimport numpy as np\nblank_image = np.zeros((100,300,3), np.uint8)\nfont = cv2.FONT_HERSHEY_SIMPLEX \norg = (10, 50) \nfontScale = .5\ncolor = (255, 0, 0)  \nthickness = 1\nblank_image = cv2.putText(blank_image, "\xd8\xa7\xd9\x84\xd9\x84\xd8\xba\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a\xd8\xa9", org, font,  \n                   fontScale, color, thickness, cv2.LINE_AA)\nwindow_name = \'Image\'\ncv2.imshow(window_name, blank_image) \ncv2.waitKey(0)\ncv2.destroyAllWindows()\n
Run Code Online (Sandbox Code Playgroud)\n\n

问题在这里\nblank_image = cv2.putText(blank_image, "\xd8\xa7\xd9\x84\xd9\x84\xd8\xba\xd8\xa9 \xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\ xd8\xa8\xd9\x8a\xd8\xa9", org, 字体,
\n 字体比例, 颜色, 粗细, cv2.LINE_AA)

\n\n

输出

\n

Ahm*_*Ali 7

fontpath = "arial.ttf" # <== download font\nfont = ImageFont.truetype(fontpath, 32)\nimg_pil = Image.fromarray(frame)\ndraw = ImageDraw.Draw(img_pil)\ndraw.text((50, 80),'\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a', font = font)\nimg = np.array(img_pil)\ncv2.imshow(window_name, img) \n
Run Code Online (Sandbox Code Playgroud)\n
import cv2 \nimport arabic_reshaper\nfrom bidi.algorithm import get_display\nimport numpy as np\nfrom PIL import ImageFont, ImageDraw, Image\n\n\ncap = cv2.VideoCapture(0)\n\nwhile(True):\n    # Capture frame-by-frame\n    ret, frame = cap.read()\n    text = "\xd8\xb0\xd9\x87\xd8\xa8 \xd8\xa7\xd9\x84\xd8\xb7\xd8\xa7\xd9\x84\xd8\xa8 \xd8\xa7\xd9\x84\xd9\x89 \xd8\xa7\xd9\x84\xd9\x85\xd8\xaf\xd8\xb1\xd8\xb3\xd8\xa9"\n    reshaped_text = arabic_reshaper.reshape(text)\n    bidi_text = get_display(reshaped_text) \n    fontpath = "arial.ttf" # <== https://www.freefontspro.com/14454/arial.ttf  \n    font = ImageFont.truetype(fontpath, 32)\n    img_pil = Image.fromarray(frame)\n    draw = ImageDraw.Draw(img_pil)\n    draw.text((50, 80),bidi_text, font = font)\n    img = np.array(img_pil)\n\n    cv2.imshow('window_name', img) \n\n\n    if cv2.waitKey(1) & 0xFF == ord('q'):\n        break\n\n# When everything done, release the capture\ncap.release()\ncv2.destroyAllWindows()\n
Run Code Online (Sandbox Code Playgroud)\n

  • 请提供您的代码如何解决问题的解释。干杯! (4认同)