计算机视觉(六)

川长思鸟来 2022-06-02 02:47 350阅读 0赞
  1. 人脸检测和识别
  2. opencvdata/haarcascades,该文件夹包含了所有的opencvv人脸检测的xml文件,这些文件用于检测静止图像、视频和摄像头所得到的图像中的人脸。

使用时直接索引到该文件。

1、静态图像中的人脸检测

级联分类

  1. def CascadeClassifier(filename=None): # real signature unknown; restored from __doc__ """ CascadeClassifier([filename]) -> <CascadeClassifier object> """ pass
  2. from cv2 import *
  3. image=imread('D:/temp/f1.jpg')
  4. def detect(frame):
  5. #负责人脸检测
  6. face_cascades=CascadeClassifier('D:/cascades/haarcascade_frontalface_default.xml')
  7. #必须转换成灰度图
  8. gray=cvtColor(frame,COLOR_BGR2GRAY)
  9. #实际的人脸检测
  10. faces=face_cascades.detectMultiScale(gray,1.3,5)
  11. #通过依次提取faces变量中的值来找到人脸,并在人脸周围绘制红色矩形,这是在原始图像而不是在灰度图上
  12. for (x,y,w,h) in faces:
  13. frame=rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
  14. namedWindow('Detected')
  15. imshow('Detected',frame)
  16. waitKey()
  17. detect(image)
  18. destroyAllWindows() 2、视频中的人脸检测
  19. from cv2 import *
  20. videocaptrue=VideoCapture(0)
  21. ret,frame=videocaptrue.read()
  22. def detect(frame):
  23. face_cascades=CascadeClassifier('D:/cascades/haarcascade_frontalface_default.xml')
  24. # img=imread(filename)
  25. gray=cvtColor(frame,COLOR_BGR2GRAY)
  26. faces=face_cascades.detectMultiScale(gray,1.3,5)
  27. for (x,y,w,h) in faces:
  28. frame=rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)
  29. namedWindow('Detected')
  30. imshow('Detected',frame)
  31. waitKey(1)
  32. while ret:
  33. detect(frame)
  34. ret, frame = videocaptrue.read()
  35. destroyAllWindows() 3、视频中人脸及眼睛
  36. 来源:http://bluewhale.cc/2017-07-28/use-python-and-opencv-to-detect-faces-and-eyes.html
  37. 使用numpycv2两个库。
  38. Source code
  39. #导入所需库文件
  40. import numpy as np
  41. import cv2
  42. 加载Haar特征分类器中的面部识别和眼睛识别两个xml文件。如何你还需要识别更多的元素也在这里一并加载。
  43. Source code
  44. #加载面部识别文件(请按文件实际存储路径进行调整)
  45. #https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml
  46. face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
  47. #加载眼部识别文件(请按文件实际存储路径进行调整)
  48. #https://github.com/Itseez/opencv/blob/master/data/haarcascades/haarcascade_eye.xml
  49. eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
  50. 打开你的摄像头来获取视频,到这一步摄像头开始工作,但还没有任何影像输出。如果没有摄像头可以使用电脑里的视频文件进行替代。
  51. Source code
  52. #打开摄像头获取视频
  53. cap = cv2.VideoCapture(0)
  54. 我们同时将对摄像头获取的图像进行保存,这里对视频文件进行处理并设置保存路径及视频尺寸。(这一步不是必须的操作)
  55. Source code
  56. #编译并输出保存视频
  57. fourcc = cv2.VideoWriter_fourcc(*'XVID')
  58. out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
  59. 开始获取并处理视频内容。下面是一个无限的循环结构,通过按键q可以结束循环。在这个循环中ret获取摄像头是否有返回的布尔值,img获取摄像头拍摄的视频内容。我们首先将摄像头获取的彩色图像转化为灰度图像。后续的操作将主要在灰度图像上完成,然后再使用灰度图像中的坐标对原始的彩色图像进行标记和输出。图像转化为灰度后首先进行人脸检测,然后在人脸检测的基础上再进行眼睛检测,这样做的原因有两点,1,避免面部以外的物体被错误的识别为眼睛,2,眼睛识别算法需要一些眼睛周围的面部特征来进行检测,从而提高准确率。 随后使用矩形绘制出人脸的位置和眼睛的位置,在设置绘制颜色时需要注意,OpenCV中的颜色值并不是RGB,而是BRG。检测和绘制完成后对图像进行输出。这时可以在视频窗口中看到被标记的面部和眼睛。由于我们使用的Haar特征分类器是正面面部识别,因此需要正对摄像头。如果面部发生偏转则无法识别。
  60. Source code
  61. #无限循环
  62. while(True):
  63. #获取视频及返回状态
  64. ret, img = cap.read()
  65. #将获取的视频转化为灰色
  66. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  67. #检测视频中的人脸,并用vector保存人脸的坐标、大小(用矩形表示)
  68. faces = face_cascade.detectMultiScale(gray, 1.3, 5)
  69. #脸部检测
  70. for (x,y,w,h) in faces:
  71. cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
  72. roi_gray = gray[y:y+h, x:x+w]
  73. roi_color = img[y:y+h, x:x+w]
  74. #检测视频中脸部的眼睛,并用vector保存眼睛的坐标、大小(用矩形表示)
  75. eyes = eye_cascade.detectMultiScale(roi_gray)
  76. #眼睛检测
  77. for (ex,ey,ew,eh) in eyes:
  78. cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
  79. #显示原图像
  80. cv2.imshow('img',img)
  81. #按q键退出while循环
  82. if cv2.waitKey(30) & 0xFF == ord('q'):
  83. break
  84. 退出while循环后释放摄像头,完成视频输出并关闭所有窗口。
  85. Source code
  86. #释放摄像头
  87. cap.release()
  88. #关闭视频输出
  89. out.release()
  90. #关闭所有窗口
  91. cv2.destroyAllWindows()
  92. 4、人脸识别

定义:程序能识别给定图像或视频中的脸。

方法:用一系列分好类的图像(人脸数据库)来“训练”程序,并基于这些图像来进行识别。

4.1生成人脸识别数据

需满足以下条件:

--图像是灰度格式,后缀名为.pgm

--图像形状为正方形

--图像大小要一样(以下使用200x200的大小)

脚本代码:

  1. from cv2 import *
  2. def generate():
  3. face_cascades = CascadeClassifier('D:/cascades/haarcascade_frontalface_default.xml')
  4. eye_cascades = CascadeClassifier('D:/cascades/haarcascade_eye.xml')
  5. videocap=VideoCapture(0)
  6. count=0
  7. while 1:
  8. ret,frame=videocap.read()
  9. gray=cvtColor(frame,COLOR_BGR2GRAY)
  10. faces=face_cascades.detectMultiScale(gray,1.3,5)
  11. for (x,y,w,h) in faces:
  12. img=rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)
  13. f=resize(gray[y:y+h,x:x+w],(200,200))
  14. imwrite('D:/temp/Mypic/%s.pgm'%str(count),f)
  15. count+=1
  16. imshow('Camer',frame)
  17. if waitKey(1000/12)&0xff==ord('q'):
  18. break
  19. videocap.release()
  20. destroyAllWindows()
  21. if __name__=='__main__':
  22. generate()

过程:人脸检测,裁剪灰度帧的区域,将其大小调整为200x200像素,保存在指定的文件夹中,文件的后缀名为.pgm。需要一个count对图像进行编号。

待续。。。

发表评论

表情:
评论列表 (有 0 条评论,350人围观)

还没有评论,来说两句吧...

相关阅读

    相关 计算机视觉(三)

    1、滤波器 傅里叶变换主要作用反应图像各区域像素变化的幅度。 滤波器(核)矩阵:一组权重集合(内部所有值加和为0),作用在源图像的一个区域(滑动),并由此生成目标图像的一个

    相关 计算机视觉(二)

    1、捕获摄像头的帧   VideoCapture类可以获得摄像头的帧流。但对摄像头而言,通常不是用视频的文件名来构造VideoCapture类,而是需要传递摄像头的设备索引(