Python OpenCV putText() 显示(非ascii、unicode、utf)字符符号

标签 python image opencv image-processing computer-vision

我正在用亚美尼亚语创建一个手语检测应用程序。但是,亚美尼亚字母在我签名时不会显示,但会显示在我的控制台/终端中。我的代码不起作用,我在做什么错。让我知道如何更改或实现以在屏幕上显示字母。目前,任何非 ascii 字符都显示为 ?????? 或方框,而不是像这样的实际字符或符号

enter image description here enter image description here

如何使用 OpenCV 的 putText() 方法显示非 ASCII 字符/文本而不是 ??

PS:我什至尝试使用 PIL 实现,但没有成功。提前感谢您的帮助。

此外,当我使用 unicode_font 而不是 cv2.QT_FONT_NORMAL 时,我在签名时遇到错误:

Argument 'fontFace' is required to be an integer

这是我的代码:

dict_letter = {0: 'Ա', 1: 'Բ', 2: 'Գ', 3: 'Դ', 4: 'Ե', 5: 'Զ', 6: 'Է', 7: 'Ը', 8: 'Թ', 9: 'Ժ', 10: 'Ի', 11: 'Լ', 12: 'Խ', 13: 'Ծ', 14: 'Կ', 15: 'Հ', 16: 'Ձ', 17: 'Ղ', 18: 'Ճ', 19: 'Մ', 20: 'Յ', 21: 'Ն', 22: 'Շ', 23: 'Ո', 24: 'Չ', 25: 'Պ', 26: 'Ջ', 27: 'Ռ', 28: 'Ս', 29: 'Վ', 30: 'Տ', 31: 'Ր', 32: 'Ց', 33: 'Փ', 34: 'Ք', 35: 'Ֆ'}

font_size=36
unicode_font = ImageFont.truetype("/NEW/NotoSansArmenian-VariableFont_wdth,wght.ttf", font_size)
img = cv2.putText(image_hand, f"{dict_letter[pred]}", (x_square, y_square - 5), cv2.QT_FONT_NORMAL, 0.6, (0,0,0), 2)

更新代码:

      image = np.zeros((100, 950, 3), dtype=np.uint8)
                image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
                pil_image = Image.fromarray(image)

               

                 #using mac 
                font = ImageFont.truetype("/System/Library/Fonts/Supplemental/Arial.ttf", 35)
                draw = ImageDraw.Draw(pil_image)
                draw.text((30, 30), dict_letter[pred], font=font)

 
                image = np.asarray(pil_image)
                image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
                cv2.imshow('image', image)
                cv2.waitKey() 

最佳答案

据我所知,cv2.putText()只支持小的 ascii 字符子集,不支持 unicodeutfnon-ascii 字符。简短的回答是,没有内置的 OpenCV 功能可以在图像上显示 unicode 字符/文本符号。但是有一个解决方法!我们可以将图像从 OpenCV 转换为 PIL,将 non-ascii 文本绘制到图像上,然后再转换回 OpenCV。重要的是要记住 OpenCV 使用 BGR 而 PIL 使用 RGB 所以我们需要从 BGR 转换为 RGB ( OpenCV -> PIL) 和 RGB 返回到 BGR (PIL -> OpenCV)。


想法是使用 Numpy(或任何加载的图像)创建一个空白掩码,从 OpenCV 转换为 PIL,在图像上绘制非 ascii 文本,然后从 PIL 转换回 OpenCV。这是一个显示每个亚美尼亚字母的工作示例:

enter image description here

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

# Create black mask using Numpy and convert from BGR (OpenCV) to RGB (PIL)
# image = cv2.imread('1.png') # If you were using an actual image
image = np.zeros((100, 950, 3), dtype=np.uint8)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
pil_image = Image.fromarray(image)

# Draw non-ascii text onto image
font = ImageFont.truetype("C:\Windows\Fonts\\arial.ttf", 35)
draw = ImageDraw.Draw(pil_image)
draw.text((30, 30), "ԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՓՔՖ", font=font)

# Convert back to Numpy array and switch back from RGB to BGR
image = np.asarray(pil_image)
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
cv2.imshow('image', image)
cv2.waitKey()

显示其他语言和/或字符符号

根据要显示的语言/符号,您可能需要修改 ImageFont.truetype()字体。在 Windows 上,所有默认字体都位于 C:\Windows\Fonts 文件夹中。只需根据您要显示的符号选择所需的字体。右键单击字体文件并选择属性以获取确切的文件名和扩展名。例如显示汉字:

enter image description here

font = ImageFont.truetype("C:\Windows\Fonts\simsun.ttc", 35)
draw.text((30, 30), "我是你的爸爸", font=font)

对于日语:

enter image description here

font = ImageFont.truetype("C:\Windows\Fonts\YuGothL.ttc", 35)
draw.text((30, 30), "桜はかっこいい", font=font)

注意:如果您使用的是 Mac,请参阅 Loading fonts in Python/Pillow on a Mac

关于Python OpenCV putText() 显示(非ascii、unicode、utf)字符符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71962098/

相关文章:

algorithm - 图像失真算法资源

c++ - 光流 - 运动直方图

python - OpenCV - 应用霍夫线变换后裁剪图像

python - 如何使用python在Excel单元格中显示嵌入的文本文件

python - Numpy Pandas 安装失败,/dev/null 上存在沙箱冲突

python - scipy 优化最小化函数不强制约束

iphone - 如何在 iPhone SDK 中将图像保存为带有 alpha channel 或 alpha mask 的 Tiff 或 PNG?

java - 从 jython 调用具有可变长度参数(varags)的 Java 方法

javascript - 从页面上的图像中检索二进制数据/EXIF

django - 无法在 django(使用 python-opencv)项目中找到人脸(人脸检测)