Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Jetson.utils.cudaFont.overlyText()函数时,如何处理非标准英语字母?_Python_Nvidia Jetson Nano - Fatal编程技术网

Python 使用Jetson.utils.cudaFont.overlyText()函数时,如何处理非标准英语字母?

Python 使用Jetson.utils.cudaFont.overlyText()函数时,如何处理非标准英语字母?,python,nvidia-jetson-nano,Python,Nvidia Jetson Nano,我试图制作一个程序,检测对象,然后将对象名称翻译成丹麦语,但当将翻译文本叠加在图像本身上时,英文中找不到的字母,如Æ、Ø和Å,总是显示得非常糟糕(例如fængsel显示为fÃ|ngsel)。在命令行中,我打印出输入函数参数的文本,它在命令提示符下显示良好,但在图像上叠加时显示不好 font.OverlayText(img, width, height, "{:05.2f}% {:s}".format(confidence * 100, translateText(class_desc, "da"

我试图制作一个程序,检测对象,然后将对象名称翻译成丹麦语,但当将翻译文本叠加在图像本身上时,英文中找不到的字母,如Æ、Ø和Å,总是显示得非常糟糕(例如fængsel显示为fÃ|ngsel)。在命令行中,我打印出输入函数参数的文本,它在命令提示符下显示良好,但在图像上叠加时显示不好

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

我使用Python 3,并拥有英伟达Jexon 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()

您正在使用UTF-8编码文本输入
cudafont
。现在看来,似乎没有任何东西可以处理UTF-8,或者,如果我认为正确的话,甚至没有任何东西可以对任何东西进行重新编码,从字体中的自然字形顺序到常规编码:

charc=str[n];
if(cLastGlyph)
继续;
c-=第一字形;
... 现在c将保存字符的字形数据
(从函数
int4 cudaFont::TextExtents

这意味着该库在字符处理方面严重受损。 在以下上下文中,字形仅表示“可与现有字符或字符组合关联的特定图像”(即连字“fi”是表示两个字符“f”和“i”的单个字形)。字体还必须定义编码(内置,根据特定约定,如PostScript Type 1字体,或在TrueType/OpenType字体的情况下,在其
cmap
表中定义)将字符代码与其正确的字形关联

CUDA的默认字体DejaVu Sans和DejaVu Sans Mono是TrueType字体,并且确实包含
cmap
表格,因此它们的字形可以以任意随机顺序排列–这取决于字体设计师的判断。字体可以先列出其所有a字形,然后列出其所有B字形,依此类推,或者按字面上的任意顺序排列。如果字体包含拉丁-1编码表,该表将在
A
的字符代码和相应字形的字体字形位置之间进行转换。如果同一字体也包含完全不同的编码,例如EBCDIC,则它自己的
A
代码(不基于ASCII,因此不是“通常的”0x41,而是0xC1)仍将指向字体中相同的
字形

cudafont
所做的完全是另一回事。它假设至少基本ASCII的字形从字体中的第一个字形开始,以完全相同的顺序出现。这意味着您不能使用字体设计者强加的字形顺序以外的任何其他字形顺序。此外,因为
cudafont
限制字符代码仅为8位,您无法访问6107(DejaVu SAN)和3309(DejaVu SAN Mono)字符中的任何字符,ASCII代码256之前的字符除外

我简单地浏览了一下字形集,发现它们是按Unicode顺序排列的。现在,幸运的是(对于
cudafont
s程序员),这确实意味着前95个字符是按ASCII顺序排列的

不幸的是,我的西欧读者(通常对拉丁语-1之外的任何东西都不感兴趣)–下一个代码仍然遵循通用顺序,但按照惯例,从0x7F到0x9F的范围丢失。在基于原始拉丁-1的Unicode拉丁-1补充中,这些代码表示且没有字形表示

这仍然意味着您无法将Python的默认UTF-8编码字符串输入其中,但除了纯ASCII之外,您也无法指示Python将文本编码为拉丁语-1。Python可以对其进行编码:

text='fængsel'
打印(文本)
打印(文本编码('latin-1'))
芬塞尔
b'f\xe6ngsel'
但由于缺少该范围,将显示一个字符,该字符在列表中仅显示33个字形:
ć

解决方案:中间缺少33个字符,因此您可以调整(现在)二进制字符串内容以再次匹配物理标志符号顺序:


btext=bytes([c如果c您正在向
cudafont
输入UTF-8编码的文本。看看,似乎没有任何东西可以处理UTF-8–或者,如果我认为正确的话,甚至没有任何东西可以重新编码任何东西,从字体中的自然字形顺序到常规编码:

charc=str[n];
if(cLastGlyph)
继续;
c-=第一字形;
…现在c将保存字符的字形数据
(从函数
int4 cudaFont::TextExtents

这意味着该库在字符处理方面严重受损。 在以下上下文中,字形仅表示“可与现有字符或字符组合关联的特定图像”(即连字“fi”是表示两个字符“f”和“i”的单个字形)。字体还必须定义编码(内置,根据特定约定,如PostScript Type 1字体,或在TrueType/OpenType字体的情况下,在其
cmap
表中定义)将字符代码与其正确的字形关联

CUDA的默认字体DejaVu Sans和DejaVu Sans Mono是TrueType字体,并且确实包含
cmap
表格,因此它们的字形可以以任意随机顺序排列–这取决于字体设计师的判断。字体可以先列出其所有a字形,然后列出其所有B字形,依此类推,或者按字面上的任意顺序排列。如果字体包含拉丁-1编码表,该表将在
A
的字符代码和相应glyp字体的字形位置之间转换