손가락 감지의 첫 버전은 단순했습니다. 화면이 빨개지면 손가락이 있는 것이다. 책상 위에서는 잠깐 잘 동작했지만, 휴대폰 각도가 바뀌자 바로 무너졌습니다. 빨간 물체, 어두운 방, 가장자리로 새는 빛도 단일 조건을 속일 수 있었습니다.

그래서 질문을 좁혔습니다. 측정에 쓸 수 있는 손끝 프레임은 어떤 모습인가. 그리고 단지 붉어 보일 뿐인 프레임은 어떻게 거절할 것인가.
하나의 숫자만 믿지 않는다
손가락으로 덮인 프레임은 여러 특징을 동시에 가집니다. 빨갛기만 해서는 부족합니다. 밝기가 적당해야 하고, 빨간 채널이 초록과 파랑보다 강해야 하며, 빨간색이 우세한 픽셀 비율도 충분해야 합니다.
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
밝기는 명백한 실패를 걸러냅니다. 빨간색 비율은 손끝다운 색 변화를 확인합니다. 빨간색 우세 픽셀 비율은 일부 붉은 점만으로 통과하는 일을 막습니다.
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: 밝기가 상한보다 높음
나쁜 한 프레임 때문에 측정을 리셋하면 안 되고, 좋은 한 프레임 때문에 바로 시작해도 안 됩니다. MonoPump의 목표는 빨간 프레임을 모두 감지하기가 아니라, 다음 몇 초 동안 쓸 만한 파형이 나올 때만 시작하기입니다.