最初の指検出は単純に見えました。画面が赤ければ指がある。机の上ではしばらく動きましたが、角度を変えた瞬間に崩れました。赤い物体、暗い部屋、横から漏れる光でも、単一の条件は簡単にだまされます。

そこで問いを変えました。測定に使える指先フレームはどんな特徴を持つのか。そして、ただ赤っぽいだけのフレームをどう拒否するのか。
ひとつの数字に頼らない
指で覆われたフレームには複数の条件があります。赤いだけでは足りません。明るさが適切で、赤チャンネルが緑や青より強く、赤が優位な画素が十分にある必要があります。
Flow diagram
Preparing diagram
This diagram could not be rendered. Its source is still available below.
View diagram source
flowchart TD
A[中央領域をサンプリング] --> B[平均 RGB を計算]
B --> C[明るさは有効範囲か]
C -- no --> D[暗すぎる/明るすぎる]
C -- yes --> E[赤比率は十分か]
E -- no --> F[指なし]
E -- yes --> G[赤の優位性は安定か]
G -- weak --> H[覆いが弱い]
G -- strong --> I[良好]
中央を使うのは理由があります。端は光漏れ、指の曲面、動きの影響を受けやすい場所です。
brightness = (avgRed + avgGreen + avgBlue) / 3
redRatio = avgRed / max((avgGreen + avgBlue) / 2, 1)
redDominance = avgRed / max(avgGreen, avgBlue)
dominantRedPixelFraction = redDominantPixels / sampledPixels
明るさは明らかな失敗を拾います。赤比率は指先らしさを見ます。赤優位の画素割合は、少数の赤い点だけで合格しないための保険です。
State diagram
Preparing diagram
This diagram could not be rendered. Its source is still available below.
View diagram source
stateDiagram-v2
[*] --> none
none --> weakCoverage: 赤は見えるが弱い
weakCoverage --> good: 赤の優位性が安定
good --> weakCoverage: 圧力や位置が変わる
weakCoverage --> none: 赤比率が下がる
none --> tooDark: 明るさが下限未満
none --> tooBright: 明るさが上限超過
悪い 1 フレームで測定をリセットすべきではないし、良い 1 フレームで開始すべきでもありません。MonoPump の境界は、赤いものを全部検出することではなく、次の数秒で使える波形が取れそうなときだけ始めることです。