当前位置:   article > 正文

基于opencv实现人脸识别案例_opencv人脸识别

opencv人脸识别

一、基础

我们使用机器学习的方法完成人脸检测,首先需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器。我们需要从其中提取特征。下图中的 Haar 特征会被使用,就像我们的卷积核,每一个特征是一个值,这个值等于黑色矩形中的像素值之后减去白色矩形中的像素值之和。

Haar特征值反映了图像的灰度变化情况。例如:脸部的一些特征能由矩形特征简单的描述,眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。

Haar特征可用于于图像任意位置,大小也可以任意改变,所以矩形特征值是矩形模版类别、矩形位置和矩形大小这三个因素的函数。故类别、大小和位置的变化,使得很小的检测窗口含有非常多的矩形特征。

得到图像的特征后,训练一个决策树构建的adaboost级联决策器来识别是否为人脸。

 

二、实现

OpenCV中自带已训练好的检测器,包括面部,眼睛,猫脸等,都保存在XML文件中,我们可以通过以下程序找到他们:

  1. import cv2 as cv
  2. print(cv.__file__)

找到的文件如下所示: 

那我们就利用这些文件来识别人脸,眼睛等。检测流程如下:

  1. 读取图片,并转换成灰度图
  2. 实例化人脸和眼睛检测的分类器对象
  3. # 实例化级联分类器 classifier =cv.CascadeClassifier( "haarcascade_frontalface_default.xml" ) # 加载分类器 classifier.load('haarcascade_frontalface_default.xml')
  4. 进行人脸和眼睛的检测
  5. rect = classifier.detectMultiScale(gray, scaleFactor, minNeighbors, minSize,maxsize)
  6. 参数:
  7. Gray: 要进行检测的人脸图像
  8. scaleFactor: 前后两次扫描中,搜索窗口的比例系数
  9. minneighbors:目标至少被检测到minNeighbors次才会被认为是目标
  10. minsize和maxsize: 目标的最小尺寸和最大尺寸
  11. 将检测结果绘制出来就可以了。

主程序如下所示:

  1. import cv2 as cv
  2. import matplotlib.pyplot as plt
  3. # 1.以灰度图的形式读取图片
  4. img = cv.imread("16.jpg")
  5. gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
  6. # 2.实例化OpenCV人脸和眼睛识别的分类器
  7. face_cas = cv.CascadeClassifier( "haarcascade_frontalface_default.xml" )
  8. face_cas.load('haarcascade_frontalface_default.xml')
  9. eyes_cas = cv.CascadeClassifier("haarcascade_eye.xml")
  10. eyes_cas.load("haarcascade_eye.xml")
  11. # 3.调用识别人脸
  12. faceRects = face_cas.detectMultiScale( gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
  13. for faceRect in faceRects:
  14. x, y, w, h = faceRect
  15. # 框出人脸
  16. cv.rectangle(img, (x, y), (x + h, y + w),(0,255,0), 3)
  17. # 4.在识别出的人脸中进行眼睛的检测
  18. roi_color = img[y:y+h, x:x+w]
  19. roi_gray = gray[y:y+h, x:x+w]
  20. eyes = eyes_cas.detectMultiScale(roi_gray)
  21. for (ex,ey,ew,eh) in eyes:
  22. cv.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
  23. # 5. 检测结果的绘制
  24. plt.figure(figsize=(8,6),dpi=100)
  25. plt.imshow(img[:,:,::-1]),plt.title('检测结果')
  26. plt.xticks([]), plt.yticks([])
  27. plt.show()

结果:

 

我们也可在视频中对人脸进行检测:

  1. import cv2 as cv
  2. import matplotlib.pyplot as plt
  3. # 1.读取视频
  4. cap = cv.VideoCapture("movie.mp4")
  5. # 2.在每一帧数据中进行人脸识别
  6. while(cap.isOpened()):
  7. ret, frame = cap.read()
  8. if ret==True:
  9. gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
  10. # 3.实例化OpenCV人脸识别的分类器
  11. face_cas = cv.CascadeClassifier( "haarcascade_frontalface_default.xml" )
  12. face_cas.load('haarcascade_frontalface_default.xml')
  13. # 4.调用识别人脸
  14. faceRects = face_cas.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
  15. for faceRect in faceRects:
  16. x, y, w, h = faceRect
  17. # 框出人脸
  18. cv.rectangle(frame, (x, y), (x + h, y + w),(0,255,0), 3)
  19. cv.imshow("frame",frame)
  20. if cv.waitKey(1) & 0xFF == ord('q'):
  21. break
  22. # 5. 释放资源
  23. cap.release()
  24. cv.destroyAllWindows()

三、总结

opencv中人脸识别的流程是:

  1. 读取图片,并转换成灰度图
  2. 实例化人脸和眼睛检测的分类器对象
  1. # 实例化级联分类器
  2. classifier =cv.CascadeClassifier( "haarcascade_frontalface_default.xml" )
  3. # 加载分类器
  4. classifier.load('haarcascade_frontalface_default.xml')
  1. 进行人脸和眼睛的检测
rect = classifier.detectMultiScale(gray, scaleFactor, minNeighbors, minSize,maxsize)
  1. 将检测结果绘制出来就可以了。

我们也可以在视频中进行人脸识别

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/278397
推荐阅读
相关标签
  

闽ICP备14008679号