python利用Opencv实现人脸识别功能


Posted in Python onApril 25, 2019

本文实例为大家分享了python利用Opencv实现人脸识别功能的具体代码,供大家参考,具体内容如下

首先:需要在在自己本地安装opencv具体步骤可以问度娘

如果从事于开发中的话建议用第三方的人脸识别(推荐阿里)

1、视频流中进行人脸识别

# -*- coding: utf-8 -*-
 
import cv2
import sys
from PIL import Image
 
 
def CatchUsbVideo(window_name, camera_idx):
  cv2.namedWindow(window_name)
 
  # 视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头
  cap = cv2.VideoCapture(camera_idx)
 
  # 告诉OpenCV使用人脸识别分类器
  classfier = cv2.CascadeClassifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml")
 
  # 识别出人脸后要画的边框的颜色,RGB格式
  color = (0, 255, 0)
 
  count=0
 
  while cap.isOpened():
    ok, frame = cap.read() # 读取一帧数据
    if not ok:
      break
 
      # 将当前帧转换成灰度图像
    grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 
    # 人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数
    faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
    if len(faceRects) > 0: # 大于0则检测到人脸
      count=count+1
  return count
 
 
if __name__ == '__main__':
  result=CatchUsbVideo("识别人脸区域", '2222.mp4')
  if result>0:
    print('视频中有人!!')
  else:
    print('视频中无人!!')

2、通过图片识别人脸

#-*-coding:utf8-*-#
 
import os
import cv2
from PIL import Image,ImageDraw
from datetime import datetime
import time
 
#detectFaces()返回图像中所有人脸的矩形坐标(矩形左上、右下顶点)
#使用haar特征的级联分类器haarcascade_frontalface_default.xml,在haarcascades目录下还有其他的训练好的xml文件可供选择。
#注:haarcascades目录下训练好的分类器必须以灰度图作为输入。
def detectFaces(image_name):
  img = cv2.imread(image_name)
  face_cascade = cv2.CascadeClassifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml")
  if img.ndim == 3:
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  else:
    gray = img #if语句:如果img维度为3,说明不是灰度图,先转化为灰度图gray,如果不为3,也就是2,原图就是灰度图
 
  faces = face_cascade.detectMultiScale(gray, 1.2, 5)#1.3和5是特征的最小、最大检测窗口,它改变检测结果也会改变
  result = []
  for (x,y,width,height) in faces:
    result.append((x,y,x+width,y+height))
  return result
 
 
#保存人脸图
def saveFaces(image_name):
  faces = detectFaces(image_name)
  if faces:
    #将人脸保存在save_dir目录下。
    #Image模块:Image.open获取图像句柄,crop剪切图像(剪切的区域就是detectFaces返回的坐标),save保存。
    save_dir = image_name.split('.')[0]+"_faces"
    os.mkdir(save_dir)
    count = 0
    for (x1,y1,x2,y2) in faces:
      file_name = os.path.join(save_dir,str(count)+".jpg")
      Image.open(image_name).crop((x1,y1,x2,y2)).save(file_name)
      count+=1
 
#在原图像上画矩形,框出所有人脸。
#调用Image模块的draw方法,Image.open获取图像句柄,ImageDraw.Draw获取该图像的draw实例,然后调用该draw实例的rectangle方法画矩形(矩形的坐标即
#detectFaces返回的坐标),outline是矩形线条颜色(B,G,R)。
#注:原始图像如果是灰度图,则去掉outline,因为灰度图没有RGB可言。drawEyes、detectSmiles也一样。
def drawFaces(image_name):
  faces = detectFaces(image_name)
  if faces:
    img = Image.open(image_name)
    draw_instance = ImageDraw.Draw(img)
    for (x1,y1,x2,y2) in faces:
      draw_instance.rectangle((x1,y1,x2,y2), outline=(255, 0,0))
    img.save('drawfaces_'+image_name)
 
#检测眼睛,返回坐标
#由于眼睛在人脸上,我们往往是先检测出人脸,再细入地检测眼睛。故detectEyes可在detectFaces基础上来进行,代码中需要注意“相对坐标”。
#当然也可以在整张图片上直接使用分类器,这种方法代码跟detectFaces一样,这里不多说。
def detectEyes(image_name):
  eye_cascade = cv2.CascadeClassifier('/usr/share/opencv/haarcascades/haarcascade_eye.xml')
  faces = detectFaces(image_name)
 
  img = cv2.imread(image_name)
  gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  result = []
  for (x1,y1,x2,y2) in faces:
    roi_gray = gray[y1:y2, x1:x2]
    eyes = eye_cascade.detectMultiScale(roi_gray,1.3,2)
    for (ex,ey,ew,eh) in eyes:
      result.append((x1+ex,y1+ey,x1+ex+ew,y1+ey+eh))
  return result
 
 
#在原图像上框出眼睛.
def drawEyes(image_name):
  eyes = detectEyes(image_name)
  if eyes:
    img = Image.open(image_name)
    draw_instance = ImageDraw.Draw(img)
    for (x1,y1,x2,y2) in eyes:
      draw_instance.rectangle((x1,y1,x2,y2), outline=(0, 0,255))
    img.save('draweyes_'+image_name)
 
 
#检测笑脸
def detectSmiles(image_name):
  img = cv2.imread(image_name)
  smiles_cascade = cv2.CascadeClassifier("/usr/share/opencv/haarcascades/haarcascade_smile.xml")
  if img.ndim == 3:
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  else:
    gray = img #if语句:如果img维度为3,说明不是灰度图,先转化为灰度图gray,如果不为3,也就是2,原图就是灰度图
 
  smiles = smiles_cascade.detectMultiScale(gray,4,5)
  result = []
  for (x,y,width,height) in smiles:
    result.append((x,y,x+width,y+height))
  return result
 
 
#在原图像上框出笑脸
def drawSmiles(image_name):
  smiles = detectSmiles(image_name)
  if smiles:
    img = Image.open(image_name)
    draw_instance = ImageDraw.Draw(img)
    for (x1,y1,x2,y2) in smiles:
      draw_instance.rectangle((x1,y1,x2,y2), outline=(100, 100,0))
    img.save('drawsmiles_'+image_name)
 
 
if __name__ == '__main__':
  time1=datetime.now()
  result=detectFaces('9.jpg')
  time2=datetime.now()
  print("耗时:"+str(time2-time1))
  if len(result)>0:
    print("有人存在!!---》人数为:"+str(len(result)))
  else:
    print('视频图像中无人!!')
 
  drawFaces('9.jpg')
  # drawEyes('obama.jpg')
  # drawSmiles('obama.jpg')
  # saveFaces('obama.jpg')
 
"""
上面的代码将眼睛、人脸、笑脸在不同的图像上框出,如果需要在同一张图像上框出,改一下代码就可以了。
总之,利用opencv里训练好的haar特征的xml文件,在图片上检测出人脸的坐标,利用这个坐标,我们可以将人脸区域剪切保存,也可以在原图上将人脸框出。剪切保存人脸以及用矩形工具框出人脸,本程序使用的是PIL里的Image、ImageDraw模块。
此外,opencv里面也有画矩形的模块,同样可以用来框出人脸。
"""

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅谈python中的正则表达式(re模块)
Oct 17 Python
Python3.x爬虫下载网页图片的实例讲解
May 22 Python
django初始化数据库的实例
May 27 Python
PySide和PyQt加载ui文件的两种方法
Feb 27 Python
Django实现跨域请求过程详解
Jul 25 Python
利用python-docx模块写批量生日邀请函
Aug 26 Python
Python 实现Image和Ndarray互相转换
Feb 19 Python
关于python 的legend图例,参数使用说明
Apr 17 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
Nov 12 Python
python分布式爬虫中消息队列知识点详解
Nov 26 Python
Pycharm配置lua编译环境过程图解
Nov 28 Python
详解Python常用的魔法方法
Jun 03 Python
Python OpenCV利用笔记本摄像头实现人脸检测
Aug 20 #Python
python使用KNN算法识别手写数字
Apr 25 #Python
Python3.5运算符操作实例详解
Apr 25 #Python
Python对象转换为json的方法步骤
Apr 25 #Python
Python+PyQt5实现美剧爬虫可视工具的方法
Apr 25 #Python
详解用python实现基本的学生管理系统(文件存储版)(python3)
Apr 25 #Python
Python基础教程之if判断,while循环,循环嵌套
Apr 25 #Python
You might like
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
PHP实现动态柱状图改进版
2015/03/30 PHP
laravel配置Redis多个库的实现方法
2019/04/10 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
js的闭包的一个示例说明
2008/11/18 Javascript
csdn 博客中实现运行代码功能实现
2009/08/29 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
js从10种颜色中随机取色实现每次取出不同的颜色
2013/10/23 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
JavaScrip调试技巧之断点调试
2015/10/22 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
2020/08/27 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
2017/02/21 Javascript
vue2组件实现懒加载浅析
2017/03/29 Javascript
Node.js使用Express创建Web项目详细教程
2017/03/31 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
jquery判断滚动条距离顶部的距离方法
2018/09/05 jQuery
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
react+redux仿微信聊天界面
2019/06/21 Javascript
对vue中的事件穿透与禁止穿透实例详解
2019/10/28 Javascript
vue 动态创建组件的两种方法
2020/12/31 Vue.js
python 实现在Excel末尾增加新行
2018/05/02 Python
Python3多线程操作简单示例
2018/05/22 Python
Python面向对象进阶学习
2019/05/21 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
mui几种页面跳转方式对比总结概括
2017/08/18 HTML / CSS
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
2014全国两会学习心得体会1000字
2014/03/10 职场文书
服务口号大全
2014/06/11 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
大学考试作弊检讨书
2015/05/06 职场文书
检讨书格式
2019/04/25 职场文书
图片批量处理 - 尺寸、格式、水印等
2022/03/07 杂记
Django基础CBV装饰器和中间件
2022/03/22 Python
如何通过一篇文章了解Python中的生成器
2022/04/02 Python