当前位置:脚本大全 > > 正文

opencv人脸识别算法(python利用Opencv实现人脸识别功能)

时间:2021-10-12 00:55:27类别:脚本大全

opencv人脸识别算法

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

本文实例为大家分享了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

    上一篇下一篇

    猜您喜欢

    热门推荐