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开发的单词频率统计工具wordsworth使用方法
Jun 25 Python
简单的Python2.7编程初学经验总结
Apr 01 Python
基于python实现的抓取腾讯视频所有电影的爬虫
Apr 22 Python
Python安装官方whl包和tar.gz包的方法(推荐)
Jun 04 Python
在python中使用requests 模拟浏览器发送请求数据的方法
Dec 26 Python
python实现字符串加密 生成唯一固定长度字符串
Mar 22 Python
Python爬虫动态ip代理防止被封的方法
Jul 07 Python
Python 装饰器原理、定义与用法详解
Dec 07 Python
django数据模型(Model)的字段类型解析
Dec 25 Python
python+playwright微软自动化工具的使用
Feb 02 Python
pytorch实现手写数字图片识别
May 20 Python
Python开发简易五子棋小游戏
May 02 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
php中3des加密代码(完全与.net中的兼容)
2012/08/02 PHP
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
Jquery实现无刷新DropDownList联动实现代码
2010/03/08 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
jquery select动态加载选择(兼容各种浏览器)
2013/02/01 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
jQuery中dom元素上绑定的事件详解
2015/04/24 Javascript
介绍一个简单的JavaScript类框架
2015/06/24 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
VUE实现Studio管理后台之鼠标拖放改变窗口大小
2020/03/04 Javascript
python去掉字符串中重复字符的方法
2014/02/27 Python
python解析xml文件操作实例
2014/10/05 Python
Eclipse中Python开发环境搭建简单教程
2016/03/23 Python
python实现决策树、随机森林的简单原理
2018/03/26 Python
python中pip的安装与使用教程
2018/08/10 Python
python实现最大优先队列
2019/08/29 Python
python yield和Generator函数用法详解
2020/02/10 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
电气技术员岗位职责
2013/11/19 职场文书
高一自我鉴定
2013/12/17 职场文书
关于迟到的检讨书
2014/01/26 职场文书
学生周末长期请假条
2014/02/15 职场文书
售前工程师职业生涯规划
2014/03/02 职场文书
中学优秀班主任事迹材料
2014/05/01 职场文书
领导班子整改方案
2014/10/25 职场文书
解决goland 导入项目后import里的包报红问题
2021/05/06 Golang
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server
使用MybatisPlus打印sql语句
2022/04/22 SQL Server
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL