最近写的一个 DEMO 中,需要把 [[OpenCV]] 处理后的视频流直接通过 [[imshow]] 显示,并且要在左上角显示对应的结果给客户演示。测试时发现用 [[putText]] 加入中文会导致乱码。
putText 乱码
看了官方文档发现使用 putText
中文乱码问题是因为在 OpenCV 中使用的是 Hershey 字体,这类字体是不支持中文的。
Pillow 介入解决
尝试使用 [[pillow]] 库中 [[Image]] 模块解决:
然后把最初代码中的 cv2.putText
替换为 add_chinese_text
即可:
需要注意的是 font_path 传递的字体在对应系统中必须存在。比如 [[macOS]] 中可以使用 STHeiti Light.ttc
字体,在 [[Ubuntu]] 可以使用 NotoSansCJK-Regular.ttc
字体(也支持传递完整的路径和相对路径)。
到此,中文应该可以正常显示了,下面是完整代码:
最后
如果文字是固定不变的,可以先用 Image.new
创建一个空白图片,然后通过 [[ImageDraw]] 把文字绘制好,这样只需要把图片叠加到 frame 上即可,不需要每一帧都重复操作。