Python OpenCV人脸识别戴道具眼镜

朱雀 2023-10-02 12:07 66阅读 0赞
  1. import cv2
  2. import numpy as np
  3. face_cascade = cv2.CascadeClassifier('./cascade_files/haarcascade_frontalface_alt.xml')
  4. eye_cascade = cv2.CascadeClassifier('./cascade_files/haarcascade_eye.xml')
  5. if face_cascade.empty():
  6. raise IOError('Unable to load the face cascade classifier xml file')
  7. if eye_cascade.empty():
  8. raise IOError('Unable to load the eye cascade classifier xml file')
  9. cap = cv2.VideoCapture(0)
  10. sunglasses_img = cv2.imread('images/sunglasses.png')
  11. while True:
  12. ret, frame = cap.read()
  13. frame = cv2.resize(frame, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
  14. vh, vw = frame.shape[:2]
  15. vh, vw = int(vh), int(vw)
  16. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  17. faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=1)
  18. centers = []
  19. for (x,y,w,h) in faces:
  20. roi_gray = gray[y:y+h, x:x+w]
  21. roi_color = frame[y:y+h, x:x+w]
  22. eyes = eye_cascade.detectMultiScale(roi_gray)
  23. for (x_eye,y_eye,w_eye,h_eye) in eyes:
  24. centers.append((x + int(x_eye + 0.5*w_eye), y + int(y_eye + 0.5*h_eye)))
  25. if len(centers) > 1: # if detects both eyes
  26. h, w = sunglasses_img.shape[:2]
  27. # Extract the region of interest from the image
  28. eye_distance = abs(centers[1][0] - centers[0][0])
  29. # Overlay sunglasses; the factor 2.12 is customizable depending on the size of the face
  30. sunglasses_width = 2.12 * eye_distance
  31. scaling_factor = sunglasses_width / w
  32. print(scaling_factor, eye_distance)
  33. overlay_sunglasses = cv2.resize(sunglasses_img, None, fx=scaling_factor, fy=scaling_factor, interpolation=cv2.INTER_AREA)
  34. x = centers[0][0] if centers[0][0] < centers[1][0] else centers[1][0]
  35. # customizable X and Y locations; depends on the size of the face
  36. x -= int(0.26*overlay_sunglasses.shape[1])
  37. y += int(0.26*overlay_sunglasses.shape[0])
  38. h, w = overlay_sunglasses.shape[:2]
  39. h, w = int(h), int(w)
  40. frame_roi = frame[y:y+h, x:x+w]
  41. # Convert color image to grayscale and threshold it
  42. gray_overlay_sunglassess = cv2.cvtColor(overlay_sunglasses, cv2.COLOR_BGR2GRAY)
  43. ret, mask = cv2.threshold(gray_overlay_sunglassess, 180, 255, cv2.THRESH_BINARY_INV)
  44. # Create an inverse mask
  45. mask_inv = cv2.bitwise_not(mask)
  46. try:
  47. # Use the mask to extract the face mask region of interest
  48. masked_face = cv2.bitwise_and(overlay_sunglasses, overlay_sunglasses, mask=mask)
  49. # Use the inverse mask to get the remaining part of the image
  50. masked_frame = cv2.bitwise_and(frame_roi, frame_roi, mask=mask_inv)
  51. except cv2.error as e:
  52. print('Ignoring arithmentic exceptions: '+ str(e))
  53. #raise e
  54. # add the two images to get the final output
  55. frame[y:y+h, x:x+w] = cv2.add(masked_face, masked_frame)
  56. else:
  57. print('Eyes not detected')
  58. cv2.imshow('Eye Detector', frame)
  59. c = cv2.waitKey(1)
  60. if c == 27:
  61. break
  62. cap.release()
  63. cv2.destroyAllWindows()

发表评论

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

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

相关阅读

    相关 opencv人脸识别

    我的劳动成果。 1.成功安装了opencv ,可是它还要编译。我放弃。 2.成功训练自己的人脸分类器。(虽然数据是别人的,算法也是系统写好的,图形库也是别人调好的)虽然识别

    相关 opencv人脸识别

    opencv人脸识别: 首先我们来简单的讲一下人脸识别流程:这里采用的是vs2017+opencv3.3扩展库 1、进行人脸检测 2、识别器训练与分类 3、人脸检测