Houssem Elhadj
Houssem Elhadj

Reputation: 61

mediapipe solution::FaceDetection

I want to use mediapipe facedetection module to crop face Images from original images and videos, to build a dataset for emotion recognition.

is there a way of getting the bounding boxes from mediapipe faceDetection solution?

cap = cv2.VideoCapture(0)
with mp_face_detection.FaceDetection(
    model_selection=0, min_detection_confidence=0.5) as face_detection:
  while cap.isOpened():
    success, image = cap.read()
    if not success:
      print("Ignoring empty camera frame.")
      continue

    image.flags.writeable = False
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    results = face_detection.process(image)
    
    # Draw the face detection annotations on the image.
    image.flags.writeable = True
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
    if results.detections:
      for detection in results.detections:
        
        mp_drawing.draw_detection(image, detection)
        
        ## 
        '''
        
        #### here i want to grab the bounding box for the detected faces in order to crop the face image
        
        '''    
        ##
            
    cv2.imshow('MediaPipe Face Detection', cv2.flip(image, 1))
    if cv2.waitKey(5) & 0xFF == 27:
      break
cap.release()

thank you

Upvotes: 5

Views: 3469

Answers (1)

Stepan Dyatkovskiy
Stepan Dyatkovskiy

Reputation: 1000

In order to figure out format you can follow two ways:

Check protobuf files in medipipe

  1. Check out for what "Detection" is: https://github.com/google/mediapipe/blob/master/mediapipe/framework/formats/detection.proto

  2. We need location_data. It should have format field, which should be BOUNDING_BOX, or RELATIVE_BOUNDING_BOX (but in fact only RELATIVE_BOUNDING_BOX).

Checkout for drawing_utils contents:

Just check for draw_detection method. You need line with cv2.rectangle call

Here's a snippet

    results = face_detection.process(image)

        # Draw the face detection annotations on the image.
        image.flags.writeable = True
        image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
        if results.detections:
            for detection in results.detections:
                draw_detection(image, detection)

                ##
                '''
        
                #### here i want to grab the bounding box for the detected faces in order to crop the face image
        
                '''
                ##
                location_data = detection.location_data
                if location_data.format == LocationData.RELATIVE_BOUNDING_BOX:
                    bb = location_data.relative_bounding_box
                    bb_box = [
                        bb.xmin, bb.ymin,
                        bb.width, bb.height,
                    ]

                    print(f"RBBox: {bb_box}")

Upvotes: 4

Related Questions