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

时间:2021-08-27 18:33:25

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

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# -*- 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、通过图片识别人脸

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#-*-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里面也有画矩形的模块,同样可以用来框出人脸。
"""

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/wsywb111/article/details/79152425