Skip to content

shaka_main

shaka_main

Geste 🤙 (shaka / « call me ») — pouce et auriculaire tendus, autres repliés.

Remplace la capture par pince immobile en bas-centre (30 août 2026). Vision ne nomme pas les poses : on lit les ratios base→bout, normalisés par la largeur de la paume, comme dans pointeur_main._mesurer.

Classes

ScoresShaka dataclass

ScoresShaka(
    index: float,
    middle: float,
    ring: float,
    little: float,
    thumb: float,
    ecart_pince: float,
)

Ratios normalisés — sert au diagnostic et aux tests.

Functions:

scores_shaka

scores_shaka(
    points: Sequence[Point],
) -> Optional[ScoresShaka]

Mesurer la pose, ou None si les repères manquent.

Source code in src/diapason/desktop/shaka_main.py
def scores_shaka(points: Sequence[Point]) -> Optional[ScoresShaka]:
    """Mesurer la pose, ou ``None`` si les repères manquent."""
    par_nom = {p.nom: p for p in points}
    if any(nom not in par_nom for nom in _NOMS_REQUIS):
        return None
    for nom in _NOMS_REQUIS:
        if par_nom[nom].confiance < _CONFIANCE_MIN:
            return None

    paume = _distance(par_nom["indexMCP"], par_nom["littleMCP"])
    if paume <= 1e-6:
        return None

    def ratio(base: str, bout: str) -> float:
        return _distance(par_nom[base], par_nom[bout]) / paume

    pouce_bases = ("thumbCMC", "thumbMP")
    pouce_longueurs = [
        ratio(base, "thumbTip")
        for base in pouce_bases
        if base in par_nom and par_nom[base].confiance >= _CONFIANCE_POUCE_BASE
    ]
    thumb_r = max(pouce_longueurs) if pouce_longueurs else 0.0

    return ScoresShaka(
        index=ratio("indexMCP", "indexTip"),
        middle=ratio("middleMCP", "middleTip"),
        ring=ratio("ringMCP", "ringTip"),
        little=ratio("littleMCP", "littleTip"),
        thumb=thumb_r,
        ecart_pince=_distance(par_nom["thumbTip"], par_nom["indexTip"]) / paume,
    )

shaka_geste

shaka_geste(points: Sequence[Point]) -> bool

True si la main forme un 🤙 assez net pour cette image.

Source code in src/diapason/desktop/shaka_main.py
def shaka_geste(points: Sequence[Point]) -> bool:
    """True si la main forme un 🤙 assez net pour cette image."""
    scores = scores_shaka(points)
    if scores is None:
        return False
    if scores.ecart_pince < _PINCE_ECART_MIN:
        return False
    if (
        scores.index > _REPLIE_MAX
        or scores.middle > _REPLIE_MAX
        or scores.ring > _REPLIE_MAX
    ):
        return False
    if scores.little < _TENDU_MIN or scores.thumb < _TENDU_MIN:
        return False
    return True