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ído4. 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âmetro | Padrão | Efeito |
|---|---|---|
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_ratio | 0.01 | 1% da imagem — evita ruído |
Saída
skin_mask: Máscara binária (uint8) com as regiões de pelebbox: 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