#使用cv2识别人脸
# 来自于opencv ,computer vision计算机视觉
#需要安装 pip install openc_python 不行指定源
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
# cv2加载图片,默认颜色通道红绿蓝,蓝绿红[:,:,::-1]是为了颜色颠倒
jin = cv2.imread('./jinzhengen.jpg')[:,:,::-1]#读取图片
cv2.imshow('frame',jin)#显示图片
#shift + tab 查看imshow的帮助api 参数 图片名 数组
cv2.waitKey(0) #通过键盘关闭窗口
-1
plt.imshow(jin)#导入绘图工具 显示图片
<matplotlib.image.AxesImage at 0x212126a0a58>
dog = plt.imread('./d.jpg')#导入图片并显示
plt.imshow(dog)
<matplotlib.image.AxesImage at 0x21209d3a320>
#检测脸 传入算法
face_detector = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
plt.imshow(jin)
<matplotlib.image.AxesImage at 0x21209de34e0>
face_zone = face_detector.detectMultiScale(jin)#缩放显示人脸区域
# 前两个数据是人脸左上角的坐标
# 后两个数,宽度和高度
face_zone
array([[226, 75, 73, 73]], dtype=int32)
plt.imshow(dog)
<matplotlib.image.AxesImage at 0x21215835518>
dog_head = dog[20:450,250:680] #把狗狗的头这个区域取出来
plt.imshow(dog_head)
<matplotlib.image.AxesImage at 0x21216412cf8>
dog_head2 = cv2.resize(dog_head,(73,73))
plt.imshow(dog_head2)
<matplotlib.image.AxesImage at 0x212164b5d68>
plt.imshow(jin)
<matplotlib.image.AxesImage at 0x2121650ada0>
for x,y,w,h in face_zone:
#x横座标 y纵座标 对于图片宽度是第二维代表列 高度是第一维代表行
jin[y:y+h,x:x+w] = dog_head2
plt.imshow(jin)
<matplotlib.image.AxesImage at 0x2121656a3c8>
#以上图片是正方形 现在把它变成圆形
import numpy as np
jin = plt.imread('./jinzhengen.jpg')#重新加载图片
jin = jin.copy()#复制
for x,y,w,h in face_zone:
# 给定条件,圆的方程
# 半径,73/2
r = int(w/2)
cirle_point = np.array([w/2,h/2])
for i in range(w):
for j in range(h):
#圆的方程圆心(a,b)方程(X-A)**2+(Y-B)**2=R**2
#(i - cirle_point[0])**2 + (j - cirle_point[1])**2 < r**2 圆里面的点
#(i - cirle_point[0])**2/1.5 + (j - cirle_point[1])**2 < r**2 椭圆
if (i - cirle_point[0])**2 + (j - cirle_point[1])**2 < r**2:
jin[y+i,x+j] = dog_head2[i,j]
plt.imshow(jin)
<matplotlib.image.AxesImage at 0x21216d9d898>