侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   182

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

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

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

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

# -*- coding: utf-8 -*- import cv2import sysfrom 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 osimport cv2from PIL import Image,ImageDrawfrom datetime import datetimeimport 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生成rsa密钥对操作示例
    下一条:
    Python OpenCV利用笔记本摄像头实现人脸检测
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客