Skip to content

Detecção de Pele

O SkinDetector é a primeira etapa do pipeline. Identifica regiões de pele na imagem para localizar o dedo.

Algoritmo

Usa thresholding dual em dois espaços de cor, combinados com AND lógico:

1. YCrCb (Luminância-Crominância)

python
# Converter para YCrCb
ycrcb = cv2.cvtColor(bgr, cv2.COLOR_BGR2YCrCb)

# Threshold nos canais Cr e Cb
mask_ycrcb = cv2.inRange(ycrcb,
    (0, 133, 77),    # Cr min=133, Cb min=77
    (255, 173, 127)   # Cr max=173, Cb max=127
)

O espaço YCrCb separa luminância (Y) de crominância (Cr, Cb), tornando a detecção mais robusta a variações de iluminação.

2. HSV (Matiz-Saturação-Valor)

python
# Converter para HSV
hsv = cv2.cvtColor(bgr, cv2.COLOR_BGR2HSV)

# Threshold
mask_hsv = cv2.inRange(hsv,
    (0, 30, 60),      # H min=0, S min=30, V min=60
    (20, 150, 255)     # H max=20, S max=150, V max=255
)

O espaço HSV captura tons de pele na faixa de matiz 0-20 (vermelho-amarelo).

3. Combinação + Limpeza

python
# AND dos dois espaços → reduz falsos positivos
skin_mask = mask_ycrcb & mask_hsv

# Limpeza morfológica
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (7, 7))
skin_mask = cv2.morphologyEx(skin_mask, cv2.MORPH_CLOSE, kernel)  # fechar buracos
skin_mask = cv2.morphologyEx(skin_mask, cv2.MORPH_OPEN, kernel)   # remover ruído

4. Localização do Dedo

python
# Encontrar o maior contorno (presumivelmente o dedo)
contours = cv2.findContours(skin_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
largest = max(contours, key=cv2.contourArea)

# Bounding box
bbox = cv2.boundingRect(largest)

Valida que a área do contorno é pelo menos min_skin_area_ratio (1%) da imagem total. Se não encontrar pele suficiente, lança NoFingerDetectedError.

Parâmetros

ParâmetroPadrãoEfeito
ycrcb_cr_range(133, 173)Range mais amplo → detecta mais tons de pele
ycrcb_cb_range(77, 127)Range mais amplo → mais permissivo
hsv_h_range(0, 20)Matiz da pele (vermelho-amarelo)
hsv_s_range(30, 150)Saturação mínima evita brancos/cinzas
hsv_v_range(60, 255)Valor mínimo evita sombras muito escuras
min_skin_area_ratio0.011% da imagem — evita ruído

Saída

  • skin_mask: Máscara binária (uint8) com as regiões de pele
  • bbox: Tupla (x, y, w, h) do bounding box do maior contorno

Limitações

  • Calibrado para tons de pele claros a médios — pode precisar de ajuste para tons muito escuros
  • Fundos com cores de pele (madeira, tecido bege) podem gerar falsos positivos
  • Iluminação colorida (neon, LED RGB) afeta significativamente a detecção

Valid S.A. - Soluções de Identidade Digital