python使用opencv打开摄像头实现人脸识别和移动检测并将检测到的人脸保存

拼搏现实的明天。 2022-12-14 03:36 385阅读 0赞

python使用opencv打开摄像头实现人脸识别和移动检测并将检测到的人脸保存,
代码如下:

  1. import cv2
  2. import time
  3. '''import numpy as np'''
  4. '''===================================================================================='''
  5. #人脸识别:
  6. def getface(image):
  7. # 创建 classifier
  8. clf = cv2.CascadeClassifier(r'D:\python\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml')
  9. gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  10. # 识别面部
  11. faces = clf.detectMultiScale(
  12. gray,
  13. scaleFactor=1.1,
  14. minNeighbors=5,
  15. minSize=(60, 60),
  16. flags=cv2.CASCADE_SCALE_IMAGE
  17. )
  18. count = 1
  19. if len(faces):
  20. for (x, y, w, h) in faces:
  21. # 设置人脸宽度大于60像素,去除较小的人脸
  22. if w>=60 and h>=60:
  23. # 以时间戳和读取的排序作为文件名称
  24. listStr = [str(int(time.time())), str(count)]
  25. fileName = ''.join(listStr)
  26. cv2.imwrite('%s.jpg' % fileName, image[y:y+h,x:x+w])
  27. count += 1
  28. return len(faces)
  29. '''===================================================================================='''
  30. # 运动检测部分,把前一帧和后一帧放入
  31. def move(pre_frame,gray_lwpCV):
  32. img_delta = cv2.absdiff(pre_frame, gray_lwpCV)
  33. thresh = cv2.threshold(img_delta, 25, 255, cv2.THRESH_BINARY)[1]
  34. thresh = cv2.dilate(thresh, None, iterations=2)#腐蚀膨胀
  35. contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  36. for c in contours: #contours为图像相减后的轮廓
  37. if cv2.contourArea(c) < 1000: # 设置敏感度
  38. continue
  39. else:
  40. print("有东西在动。。。")
  41. return 1
  42. break
  43. '''===================================================================================='''
  44. #参数设置
  45. a=1
  46. b='.jpg'
  47. fps = 5 # 帧率
  48. pre_frame = None # 总是取视频流前一帧做为背景相对下一帧进行比较
  49. i = 0
  50. flag =0
  51. flag=int(input("请输入监控模式:(0:普通监测 1:人脸检测)"))
  52. # 参数0表示第一个摄像头
  53. camera = cv2.VideoCapture(0)
  54. # 判断视频是否打开
  55. if (camera.isOpened()):
  56. print('摄像头已打开')
  57. else:
  58. print('摄像头未打开')
  59. # 无限循环读取视频流
  60. while True:
  61. grabbed, frame_lwpCV = camera.read() # 读取视频流
  62. gray_lwpCV = cv2.cvtColor(frame_lwpCV, cv2.COLOR_BGR2GRAY) # 转灰度图
  63. #判断是否读到图像信息
  64. if not grabbed:
  65. print('未读到图像信息')
  66. break
  67. face_NUM=getface(frame_lwpCV)
  68. cv2.imshow('detecting', frame_lwpCV)
  69. #预处理
  70. gray_lwpCV = cv2.resize(gray_lwpCV, (500, 500))
  71. gray_lwpCV = cv2.GaussianBlur(gray_lwpCV, (21, 21), 0)
  72. #逻辑处理
  73. if pre_frame is None:
  74. pre_frame = gray_lwpCV
  75. else:
  76. #把前一帧和后一帧放入move()中对比
  77. ccc= move(pre_frame,gray_lwpCV)
  78. if ccc==1 and flag==1:
  79. print("找到 {0} 张脸!".format(face_NUM))
  80. name=str(a)+b
  81. #如果face_NUM>=1就保存图像
  82. if(face_NUM>=1):
  83. cv2.imwrite(name,frame_lwpCV)
  84. a=a+1
  85. elif ccc==1:
  86. name=str(a)+b
  87. cv2.imwrite(name,frame_lwpCV)
  88. a=a+1
  89. pre_frame = gray_lwpCV
  90. key = cv2.waitKey(1) & 0xFF
  91. # 按'q'健退出循环
  92. if key == ord('q'):
  93. break
  94. # 释放摄像头和窗口
  95. camera.release()
  96. cv2.destroyAllWindows()

发表评论

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

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

相关阅读