我正在尝试创建一个检测对象的程序,然后将对象名称翻译成丹麦语,但是当将翻译文本覆盖在图像本身上时,总是找不到英文字母,例如Æ,Ø和Å。可怕地出现(例如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()
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
(来自功能。在下面的上下文中,Aint4 cudaFont::TextExtents
)这意味着该库在其字符处理中
严重残缺
字形
仅表示“可以与现有字符或字符组合相关联的特定图像(即,连字“-”是表示两个字符的单个字形”)字体还必须定义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'
但是由于缺少该范围,显示的字符在列表字符串内容,以再次匹配physical标志符号顺序:ć
中仅出现33个字形。解决方案:之间缺少33个字符,因此您可以调整(现在)
binary
btext = bytes([c if c <= 0x7f else c-33 for c in text.encode('latin-1')])
print (btext)
b'f\xc5ngsel'
和字符串(理论上)应该最终呈现您的that
fængsel
。