Это пятый день моего участия в ноябрьском испытании обновлений, подробности о мероприятии:Вызов последнего обновления 2021 г.
Программно-аппаратная среда
- ubuntu 18.04 64bit
- anaconda with python 3.6
- opencv 3.1.0
- Pillow 3.4.2
проблема
opencv
серединаcv2.putText
Метод может отображать символы, но, к сожалению, при отображении китайского языка символы будут искажены.putText
метод поддерживает толькоascii
небольшое подмножествоunicode
илиutf
персонаж. Ища исходный код, вы можете увидеть небольшую подсказку/home/xugaoxiang/anaconda3/pkgs/opencv3-3.1.0-py36_0/include/opencv2/core.hpp
, другие пути среды будут другими, их можно найти по имени файла. по умолчанию,opencv
используетhershey
Этот шрифт и пользовательские шрифты не поддерживаются.
//! Only a subset of Hershey fonts
//! <http://sources.isc.org/utils/misc/hershey-font.txt> are supported
enum HersheyFonts {
FONT_HERSHEY_SIMPLEX = 0, //!< normal size sans-serif font
FONT_HERSHEY_PLAIN = 1, //!< small size sans-serif font
FONT_HERSHEY_DUPLEX = 2, //!< normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX)
FONT_HERSHEY_COMPLEX = 3, //!< normal size serif font
FONT_HERSHEY_TRIPLEX = 4, //!< normal size serif font (more complex than FONT_HERSHEY_COMPLEX)
FONT_HERSHEY_COMPLEX_SMALL = 5, //!< smaller version of FONT_HERSHEY_COMPLEX
FONT_HERSHEY_SCRIPT_SIMPLEX = 6, //!< hand-writing style font
FONT_HERSHEY_SCRIPT_COMPLEX = 7, //!< more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX
FONT_ITALIC = 16 //!< flag for italic font
};
Кодекс Практика
Так как официальная не поддерживает, будем искать другие методы.Для обработки изображений первое ощущение, можно ли его использовать.Pillow
Эта библиотека после долгих поисков информации (подробности см. в Справочнике) решила проблему искаженных символов.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Date : 2018-08-15 14:05:21
# @Author : xugaoxiang (xugx.ai@gmail.com)
# @Link : link
# @Version : 1.0.0
# -*- coding: utf-8 -*-
import cv2
import numpy
from PIL import Image, ImageDraw, ImageFont
if __name__ == '__main__':
# opencv 读取本地图片文件, 数据类型是numpy.ndarray
img_OpenCV = cv2.imread('dj.jpeg')
# 将opencv图像格式转换成PIL格式, 数据类型是PIL.Image.Image
img_PIL = Image.fromarray(cv2.cvtColor(img_OpenCV, cv2.COLOR_BGR2RGB))
# 字体,默认的路径/usr/share/fonts/opentype/noto/NotoSansCJK-Black.ttc,我把它拷贝过来了
font = ImageFont.truetype('NotoSansCJK-Black.ttc', 26)
# 字体颜色
fillColor = (0,0,255)
# 文字输出位置
position = (50,50)
# 输出内容
str = '\t\t\t\t\t\t\t\t\t\t\t\t我的独立博客: \nhttps://xugaoxiang.com'
draw = ImageDraw.Draw(img_PIL)
draw.text(position, str, font=font, fill=fillColor)
# 转换回OpenCV格式
img_OpenCV = cv2.cvtColor(numpy.asarray(img_PIL),cv2.COLOR_RGB2BGR)
# 在窗口中显示
cv2.imshow("image",img_OpenCV)
while True:
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
cv2.destroyAllWindows()
Эффект от исполнения следующий