问题描述:
在作人脸识别时遇到一个问题,在识别出人脸后无法使用opencv在图片上添加汉字,只能加字母,在网上搜索后综合得到使用PIL的方法最为简单,特记于此。
解决步骤:
1.使用cv2.imdecode打开图片
image = cv2.imdecode(np.fromfile(img, dtype=np.uint8),cv2.IMREAD_COLOR)
在此不用cv2.imread是因为他无法读取路径中带有汉字的路径 ,为什么不使用Image.open(PIL库里面的函数),因为cv跟适合作人脸识别,PIL库只是拿来用一下
2.使用 Image.fromarray(img) 将上一步读取的图片转换成PIL格式
Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
这里有两个转换,第一是把图片从BGR格式转换为RGB格式(不错,opencv读取图片是BGR格式的),第二个转换时Image.fromarray(),变成了PIL格式。
3. 创建一个写的对象。等会就是使用它往图片上添加文字
draw =ImageDraw.Draw(img)
4.在图片上写文字,
font = ImageFont.truetype("simhei.ttf", 20) #设置字体 (参数字体,文字大小)
draw.text(position,word,(255,0,0),font=font) ##添加文字 参数(字的位置,字的内容,颜色,字体)
5.将图片转换为opencv的格式
img = cv2.cvtColor(np.array(img_c), cv2.COLOR_RGB2BGR)
总体代码:
import glob
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
def print_china(img,position,word):
img_c = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))
draw = ImageDraw.Draw(img_c)
font = ImageFont.truetype("simhei.ttf", 20) #设置字体 (参数字体,文字大小)
draw.text(position,word,(255,0,0),font=font) #添加文字 参数(字的位置,字的内容,颜色,字体)
img = cv2.cvtColor(np.array(img_c), cv2.COLOR_RGB2BGR)
return img
img_path = glob.glob('./img/*') #读取文件夹中所有文件 (文件夹里只有图片)
for img in img_path:
name = img.split('\\')[-1].split('.')[0] #从路径中分类出图片名字
image = cv2.imdecode(np.fromfile(img, dtype=np.uint8),cv2.IMREAD_COLOR) #读取图片
image = print_china(image,(10,10),"爸爸") #调用函数传入 图片,位置,文字
cv2.imshow('img',image) #显示图片
cv2.waitKey(0)
print(name) #打印图片名
新人上路,大佬请多多提意见,无论时代码上的,还是博客排版上的意见。