目录
1、背景
这些天在做视觉识别的任务,需要使用cv2.putText()来将中文文本绘制出来,于是发现cv2这么强大的视觉库居然连中文都不支持。比如我段示例代码,当文本是中文汉字时,出来的居然是???
import cv2
img = cv2.imread("img.png")
cv2.putText(img, '中文文本', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (51, 51, 51), 2)
cv2.imshow("Chinese", img)
cv2.waitKey()
2、原因
cv2.putText
基于 OpenCV 的底层绘制函数,这些函数通常只支持单字节的 ASCII 字符集,无法识别和处理像中文这样的多字节字符。
3、解决方法
看了很多网上的资料,以及询问了很多AI的意见,我发现都不能满足我的要求。解决方法都是:
一、转换为Pillow
二、使用FreeType
三、使用Pygame
上面的三种方法都能解决中文乱码的问题,我也成功显示了中文结果。但是我的项目涉及视频处理,对于实时性要求比较高,以上的三种方法对我而言都不理想,因为都大幅增加了处理的时间,比如当我使用Pillow绘制文本时,总时长为60秒的视频,只做处理不绘制任何文本的情况下用时18-20秒,但绘制文本后居然用了30-33秒。也就是说绘制文本居然增加了50%的用时,这对于实时性要求高的场景明显不合理。上面的三种解决方法都会大幅增加用时,具体的用时为Pillow>Pygame>FreeType。经过我实验下来,我发现OpenCV读取视频并保存视频不做任何处理的情况下用时5-6秒,使用cv2.putText()绘制文本用时只增加2-4秒。所以我决定找到使用cv2.putText()绘制中文文本的方法。终于在知乎的一篇文章听说putText()支持中文了?! - 知乎里找到解决方法!
四、真正的解决方法
先卸载OpenCV
pip uninstall opencv-python
然后安装opencv_rolling版本
pip install opencv-python-rolling
再次测试代码,发现可以正常显示中文了!