学会了人脸识别之后,可以尝试一些有趣的应用,比如制作一些表情包。
制作这张表情包需要三步:
- 将图像中的人脸识别出来,检测人脸的位置并返回。
- 对人脸的区域进行部分高斯模糊,得到马赛克效果。
- 在图片中加上中文文本。
#人脸识别
import face_recognition
import cv2
import matplotlib.pyplot as plt
image=face_recognition.load_image_file("./imgs/minguo.jpg")
face_locations=face_recognition.face_locations(image)
face_num2=len(face_locations)
print(face_num2) # 返回检测到的人脸数量
org=cv2.imread("./imgs/minguo.jpg")
for i in range(0,face_num2):
top=face_locations[i][0]
right=face_locations[i][1]
bottom=face_locations[i][2]
left=face_locations[i][3]
start=(left,top)
end=(right,bottom)
print(start,end) # 返回人脸位置
color=(0,255,0)
thickness=5
img=cv2.rectangle(org,start,end,color,thickness)
plt.imshow(img)
plt.axis("off")
plt.show()
返回值:
2、局部高斯模糊局部高斯模糊的思路是:先将人脸的部分区域复制出来,整体进行模糊,再将处理好的图像贴回到图片的原位置上。中间用到了对彩色图像进行高斯模糊的处理方法。同样的思路也可以针对视频处理,得到人脸打码的效果。
#对图像做局部模糊处理
from PIL import Image
import os
import matplotlib.pyplot as plt
from numpy import *
from scipy.ndimage import filters
print(os.getcwd()) #查看当前工作目录
box = start + end #之前返回的人脸位置信息
sticker = Image.open('./imgs/minguo.jpg')
region =sticker.crop(box) # 将识别到的人脸区域复制出来
im = array(region) #将图片转换为数组
im2 = zeros(im.shape)
for i in range(3):
im2[:,:,i] = filters.gaussian_filter(im[:,:,i],10) # 对彩色图像的每一个颜色通道进行模糊
im2 = uint8(im2)
region = Image.fromarray(im2) #将图像的数据类型转换回去,才能进行粘贴
sticker.paste(region,box)
sticker.show()
sticker.save("./imgs/sticker.jpg")
得到的图像:
3、在图像上添加中文文本
OpenCV不能写入中文,需要用PIL处理,因此中间多了两次格式的转化。
#图像上写字
import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as np
img = cv2.imread("./imgs/sticker.jpg")
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) # 转换为PIL格式
fontStyle = ImageFont.truetype("aigei.ttf", 45, encoding="utf-8")
draw = ImageDraw.Draw(img) # 创建一个可以在给定图像上绘图的对象
draw.text((30,500), "当事人:现在就是后悔,非常后悔", (0, 255, 0), font=fontStyle) # 左上角为画布坐标(0,0)点
im = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) # 转换回OpenCV格式
cv2.imshow('stickers',im)
cv2.waitKey() # imshow后面必须跟上该功能才能正常显示
cv2.imwrite("./imgs/add_text.jpg",im)
最终结果:
二、视频处理
视频处理的思路是先将视频分解成一帧一帧的图像,对每一帧进行处理,处理好后再将帧合并为视频。会用到的模块包括OpenCV、FFmpeg、PIL等。
-
OpenCV:强大的计算机视觉库,可以进行图片和视频处理
-
FFmpeg:视频处理软件,在官网下载安装包安装,代码要在命令行输入。
-
PIL:Python的图像处理工具,可以进行图像的旋转、剪裁、粘贴、调色等操作。
利用FFmpeg的命令:
ffmpeg -f image2 -i ./pic/image%d.jpg -r 24 output.mp4
可以将一个MP4格式的视频分解为24帧/秒的图像,保存在本地文件夹中。
利用OpenCV同样可以达到该目的:
import os
import cv2
import subprocess
os.chdir(r"C:Users95378Python2021")
v_path="ghz.mp4"
image_save="./pic" # 这里保存图像的文件夹需要在本地手动新建
cap=cv2.VideoCapture(v_path) # 读取本地视频
frame_count=cap.get(cv2.CAP_PROP_frame_COUNT) # 帧数
for i in range(int(frame_count)):
_,frame=cap.read() # 按帧读取视频,frame为每一帧的图像
frame=cv2.cvtColor(frame,cv2.cv2.COLOR_BGR2GRAY) # 图像转换为OpenCV格式
cv2.imwrite("./pic/image{}.jpg".format(i),frame) #写入本地文件夹


