refactor(face_swapper): combine both face and mouth masks into one
							parent
							
								
									f2894470a7
								
							
						
					
					
						commit
						28b6063003
					
				| 
						 | 
					@ -63,40 +63,29 @@ def get_face_swapper() -> Any:
 | 
				
			||||||
    return FACE_SWAPPER
 | 
					    return FACE_SWAPPER
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def create_face_mask(face: Face, frame: Frame) -> np.ndarray:
 | 
					def create_face_masks(
 | 
				
			||||||
    """Create a binary mask for the face region."""
 | 
					 | 
				
			||||||
    mask = np.zeros(frame.shape[:2], dtype=np.uint8)
 | 
					 | 
				
			||||||
    landmarks = face.landmark_2d_106
 | 
					 | 
				
			||||||
    if landmarks is not None:
 | 
					 | 
				
			||||||
        hull = cv2.convexHull(landmarks.astype(np.int32))
 | 
					 | 
				
			||||||
        cv2.fillConvexPoly(mask, hull, 255)
 | 
					 | 
				
			||||||
    return mask
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def create_lower_mouth_mask(
 | 
					 | 
				
			||||||
    face: Face, frame: Frame
 | 
					    face: Face, frame: Frame
 | 
				
			||||||
) -> Tuple[np.ndarray, np.ndarray, Tuple[int, int, int, int], np.ndarray]:
 | 
					) -> Tuple[np.ndarray, np.ndarray, Tuple[int, int, int, int], np.ndarray]:
 | 
				
			||||||
    """Create a mask for the lower mouth region."""
 | 
					    """Create both face and mouth masks in one pass."""
 | 
				
			||||||
    mask = np.zeros(frame.shape[:2], dtype=np.uint8)
 | 
					    face_mask = np.zeros(frame.shape[:2], dtype=np.uint8)
 | 
				
			||||||
 | 
					    mouth_mask = np.zeros(frame.shape[:2], dtype=np.uint8)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    landmarks = face.landmark_2d_106
 | 
					    landmarks = face.landmark_2d_106
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if landmarks is not None:
 | 
					    if landmarks is not None:
 | 
				
			||||||
        # Extract mouth landmarks
 | 
					        # Create full face mask
 | 
				
			||||||
        mouth_points = landmarks[84:96]  # Adjust indices based on your landmark format
 | 
					        hull = cv2.convexHull(landmarks.astype(np.int32))
 | 
				
			||||||
        lower_lip = mouth_points[6:12]  # Lower lip points
 | 
					        cv2.fillConvexPoly(face_mask, hull, 255)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Create polygon for lower mouth area
 | 
					        # Create mouth mask
 | 
				
			||||||
 | 
					        lower_lip = landmarks[90:96]  # Lower lip points
 | 
				
			||||||
        lower_lip_polygon = cv2.convexHull(lower_lip.astype(np.int32))
 | 
					        lower_lip_polygon = cv2.convexHull(lower_lip.astype(np.int32))
 | 
				
			||||||
        cv2.fillConvexPoly(mask, lower_lip_polygon, 255)
 | 
					        cv2.fillConvexPoly(mouth_mask, lower_lip_polygon, 255)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Get bounding box
 | 
					        # Get mouth bounding box
 | 
				
			||||||
        x, y, w, h = cv2.boundingRect(lower_lip_polygon)
 | 
					        x, y, w, h = cv2.boundingRect(lower_lip_polygon)
 | 
				
			||||||
        mouth_box = (x, y, w, h)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        # Extract the mouth region
 | 
					 | 
				
			||||||
        mouth_cutout = frame[y : y + h, x : x + w].copy()
 | 
					        mouth_cutout = frame[y : y + h, x : x + w].copy()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return mask, mouth_cutout, mouth_box, lower_lip_polygon
 | 
					        return face_mask, mouth_cutout, (x, y, w, h), lower_lip_polygon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return None, None, None, None
 | 
					    return None, None, None, None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue