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 相关文章推荐
一个基于flask的web应用诞生 用户注册功能开发(5)
Apr 11 Python
Python去除、替换字符串空格的处理方法
Apr 01 Python
一条命令解决mac版本python IDLE不能输入中文问题
May 15 Python
解决Mac下首次安装pycharm无project interpreter的问题
Oct 29 Python
python爬虫获取百度首页内容教学
Dec 23 Python
django-allauth入门学习和使用详解
Jul 03 Python
python自动识别文本编码格式代码
Dec 26 Python
python中提高pip install速度
Feb 14 Python
Django ModelForm组件原理及用法详解
Oct 12 Python
python asyncio 协程库的使用
Jan 21 Python
Python中对象的比较操作==和is区别详析
Feb 12 Python
利用Python实现模拟登录知乎
May 25 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
一个没有MYSQL数据库支持的简易留言本的编写
2006/10/09 PHP
php 无限级数据JSON格式及JS解析
2010/07/17 PHP
php简单开启gzip压缩方法(zlib.output_compression)
2013/04/13 PHP
php自动识别文字编码并转换为目标编码的方法
2015/08/08 PHP
Yii中CGridView禁止列排序的设置方法
2016/07/12 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
PHP中str_split()函数的用法讲解
2019/04/11 PHP
关于Javascript 的 prototype问题。
2007/01/03 Javascript
关于图片按比例自适应缩放的js代码
2011/10/30 Javascript
JavaScript 高级篇之闭包、模拟类,继承(五)
2012/04/07 Javascript
JS前端框架关于重构的失败经验分享
2013/03/17 Javascript
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
模拟多级复选框效果的jquery代码
2013/08/13 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
JavaScript验证18位身份证号码最后一位正确性的实现代码
2014/08/07 Javascript
jQuery制作仿Mac Lion OS滚动条效果
2015/02/10 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
2016/05/12 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
sso跨域写cookie的一段js脚本(推荐)
2016/05/25 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
vue实现一个移动端屏蔽滑动的遮罩层实例
2017/06/08 Javascript
浅谈Postman解决token传参的问题
2018/03/31 Javascript
前端js中的事件循环eventloop机制详解
2019/05/15 Javascript
JavaScript 变量,数据类型基础实例详解【变量、字符串、数组、对象等】
2020/01/04 Javascript
python解析html开发库pyquery使用方法
2014/02/07 Python
使用Python生成XML的方法实例
2017/03/21 Python
python中的break、continue、exit()、pass全面解析
2017/08/05 Python
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
python SocketServer源码深入解读
2019/09/17 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
2020/09/11 Python
美国摄影爱好者购物网站:Focus Camera
2016/10/21 全球购物
匈牙利超级网上商店和优惠:Alza.hu
2019/12/17 全球购物
海量信息软件测试笔试题
2015/08/08 面试题
安全标语口号
2014/06/09 职场文书
体育课外活动总结
2014/07/08 职场文书
postgresql使用filter进行多维度聚合的解决方法
2021/07/16 PostgreSQL