python opencv 人脸识别

导包、加载image

import cv2
print(cv2.__version__)
img = cv2.imread('jj.jpg')

调用人脸识别模块

自带的,需要调用安装的site-packages\cv2\data 下的 haarcascades文件夹里的这些东西,还不是很懂

face_detector = cv2.CascadeClassifier("haarcascades/haarcascade_frontalface_alt.xml")
eye_detector = cv2.CascadeClassifier("haarcascades/haarcascade_eye.xml")

face = face_detector.detectMultiScale(img, minNeighbors=6)#识别力度
eye = eye_detector.detectMultiScale(img, minNeighbors=3)
print(face,'\n\n',eye)

结果:返回的是x,y,w,h,即左下角左边和宽、高

框定人脸与眼睛

利用刚刚返回的坐标信息,利用rectangle画出识别框

for x,y,w,h in face:
    cv2.rectangle(img,pt1=(x,y), pt2=(x+w,y+h),color=[0,0,255],thickness=1)
for x,y,w,h in eye:
    cv2.rectangle(img,pt1=(x,y), pt2=(x+w,y+h),color=[255,255,255],thickness=1)
cv2.imshow('img',img)
cv2.waitKey(0)#图片保持刷新的时间,按任意键触发(关闭),若为0则只能手动触发
cv2.destroyAllWindows()#释放内存

结果:调整脸、眼的minNeighbor参数分别为6、3时的结果,会发现识别了很多“类似眼睛”的物品:

而调整到 分别为 6,35才刚好识别:

调用摄像头动态识别、并用其他图覆盖人脸

涉及知识点很多

  • 图片本身打开是x, y, color形式的3维数组(第3维表示RGB有3个值),维度问题用 坐标轴想象就行,第三个维度是3颜色
  • 上面的调用opencv人脸识别模块,cv2.CascadeClassifier
  • 图片保存 cv2.imwrite
  • 将新图片覆盖到检测的区域,需要注意的是选择第一个维度时,用y(纵向的坐标及范围)。看下图红色部分,图片虽然是3维,但是前两维就是此图,x是选“行”所以对一个指定的y坐标,遍历x的过程就变成一整列了!这样想就不会错啦
  • cv2.rectangle画框、cv2.imshow显示图片 
import cv2
video = cv2.VideoCapture(0)
face_detector = cv2.CascadeClassifier("haarcascades/haarcascade_frontalface_alt.xml")
def save_pic(name, pic):
    cv2.imwrite('pics/%d.png'%name, pic)

for i in range(1000):
    flag, face_pic = video.read();#是否检测的人像;截取一帧的图片像素
#     print(flag, face_pic)
    face = face_detector.detectMultiScale(face_pic, minNeighbors=20)#得到左下坐标和长宽
    pic_cover = cv2.imread('hj0.jpg')
    for x,y,w,h in face:#解包?
        pic_cover = cv2.resize(pic_cover, dsize=(w,h))
        save_pic(i, face_pic[y:y+h, x:x+w])#主要是纵向是y
        face_pic[y:y+h, x:x+w] = pic_cover            
        cv2.rectangle(face_pic, pt1=(x, y), pt2=(x + w, y + h), color=[255,255,255], thickness=1);
    cv2.imshow("camera", face_pic)
    if ord('a') == cv2.waitKey(65):# a的ascii码
        break
    
cv2.destroyAllWindows()
video.release()# 关闭录像

结果:

 

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值