使用Jetson.utils.cudaFont.OverlayText()函数时,如何处理非典型英文字母?

问题描述 投票:1回答:1

我正在尝试创建一个检测对象的程序,然后将对象名称翻译成丹麦语,但是当将翻译文本覆盖在图像本身上时,总是找不到英文字母,例如Æ,Ø和Å。可怕地出现(例如fængsel出现为fÃ| ngsel)。在命令行中,我正在打印要输入到函数参数中的文本,该文本在命令提示符下显示为正常,但在覆盖图像时显示为错误。

我正在使用python 3并拥有Nvidia Jetson nano。

这是在图像上覆盖不正确文本的行。

font.OverlayText(img, width, height, "{:05.2f}% {:s}".format(confidence * 100, translateText(class_desc, "da")), 5, 5, font.White, font.Gray40)

translateText()是一个单独的函数,在该函数中,您输入要翻译为的文本和语言,并返回我检查过的字符串是正确的]

并且字体定义为

font = jetson.utils.cudaFont()
python nvidia-jetson-nano
1个回答
0
投票
您正在以UTF-8编码的文本输入cudafont。看the source,似乎有

nothing处理UTF-8 –甚至,即使我看对了,也没有任何东西可以将anything从字体的自然字形顺序重新编码为常规编码:

char c = str[n]; if( c < FirstGlyph || c > LastGlyph ) continue; c -= FirstGlyph; ... now c will hold glyph data for a character
(来自功能int4 cudaFont::TextExtents

这意味着该库在其字符处理中

严重残缺

。在下面的上下文中,A

字形

仅表示“可以与现有字符或字符组合相关联的特定图像(即,连字“-”是表示两个字符的单个字形”)字体还必须定义encoding(内置,通过某些约定,例如PostScript Type 1字体,或者在TrueType / OpenType字体的情况下,在其字体中定义)。 cmap表)以将字符代码与其正确的字形相关联。CUDA的默认字体DejaVu Sans和DejaVu Sans Mono是TrueType字体,并且确实包含cmap表,因此它们的字形实际上可以以任意随机顺序排列-由字体设计者自行决定。字体可以首先列出其所有A字形,然后列出其所有B字形,依此类推,或者按字面顺序排列。如果字体包含Latin-1的编码表,则该表将在A

字符代码

与相应字形的字体字形位置之间转换。如果同一字体还包含完全不同的编码(例如EBCDIC),则其自己的A代码(它不是基于ASCII的,因此不是“通常的” 0x41,而是0xC1)仍将指向相同的A字体中的字形cudafont所做的完全是另一回事。

假定

至少基本ASCII的字形从该字体的第一个字形开始就以该顺序准确地出现。这意味着您不能使用除字体设计者所强加的任何其他字形顺序。另外,由于cudafont仅将字符代码限制为8位,因此您无法访问6,107(DejaVu Sans)和3,309(DejaVu Sans Mono)字符中的任何一个,但ASCII码256之前的字符除外。我简要浏览了一下字形集,在我看来,它们位于

Unicode顺序

中。现在,幸运的是(对于cudafont程序员来说),这实际上意味着前95个字符以ASCII顺序排列。不幸的是,

you

,我的西欧读者(通常对Latin-1边界以外的地区不感兴趣)–根据惯例,下一个仍然遵循通用的ISO/IEC 8859-1顺序but,范围从0x7F到0x9F丢失。在基于原始Latin-1的Unicode Latin-1补编中,这些代码表示[控制代码](https://en.wikipedia.org/wiki/C0_and_C1_control_codes],并且没有字形表示。这仍然意味着您不能将Python的默认UTF-8编码的字符串输入其中,但是除了纯ASCII外,您

并且

不能指示Python将您的文本编码为Latin-1。 Python可以对其进行编码:text = 'fængsel' print (text) print (text.encode('latin-1')) fængsel b'f\xe6ngsel'
但是由于缺少该范围,显示的字符在列表ć中仅出现33个字形。

解决方案:之间缺少33个字符,因此您可以调整(现在)

binary

字符串内容,以再次匹配physical标志符号顺序:btext = bytes([c if c <= 0x7f else c-33 for c in text.encode('latin-1')]) print (btext) b'f\xc5ngsel'

that

字符串(理论上)应该最终呈现您的fængsel
© www.soinside.com 2019 - 2024. All rights reserved.