private HandShapeSetter.HandShapeTypes JudgeHandShapeType(TrackedHand src) { //手が十分大きく映っていたり、convexの検出数が十分あるならば、手の形はパーと考えられる if (src.HandSize.x * src.HandSize.y > src.ReferenceFaceSize.x * src.ReferenceFaceSize.y * PaperHandFaceSizeFactor) { //手がでかいのでパー return(HandShapeSetter.HandShapeTypes.Paper); } if (src.ConvexDefectCount > 2) { // Convexが多いのでパー return(HandShapeSetter.HandShapeTypes.Paper); } if (src.HandSize.x > src.ReferenceFaceSize.x * PaperHandWidthRateMin) { //手が横方向に十分広がってるのでパー return(HandShapeSetter.HandShapeTypes.Paper); } //NOTE: 凹みが2つのケースというのは、人差し-中指間にくわえて、チョキの中指と薬指のあいだが凹んでると判定されるケース。 if (src.ConvexDefectCount > 0) { //Convexが1または2なのでチョキ return(HandShapeSetter.HandShapeTypes.Scissors); } //NOTE: ここはconvexがゼロなので普通はグーのハズ。ただし「指をぴっちり閉めたパー」かもしれないので、そのケースをケアする //アスペクト比を見て、縦長ならパー、正方形に近ければグー、とする return(src.HandSize.y > src.HandSize.x * PaperHandAspectRatio ? HandShapeSetter.HandShapeTypes.Paper : HandShapeSetter.HandShapeTypes.Rock); }
private void SetDetectResult(IHandDetectResult source, FaceDetectionUpdateStatus status, TrackedHand dest) { dest.HasValidHandDetectResult = source.HasValidHandArea; if (!dest.HasValidHandDetectResult) { return; } //NOTE: こっから先では座標系の正規化をやってます dest.ReferenceFacePosition = new Vector2( status.FaceArea.center.x / status.Width - 0.5f, -status.FaceArea.center.y / status.Height + 0.5f ); dest.ReferenceFaceSize = new Vector2( status.FaceArea.width / status.Width, status.FaceArea.height / status.Height ); dest.HandPosition = new Vector2( source.HandAreaCenter.x / status.Width - 0.5f, -source.HandAreaCenter.y / status.Height + 0.5f ); dest.HandSize = new Vector2( source.HandAreaSize.x / status.Width, source.HandAreaSize.y / status.Height ); //NOTE: いったん信用できない値として扱っちゃいます dest.HandTopOrientation = new Vector2(0, 1); dest.ConvexDefectCount = source.ConvexDefectVectors.Count; }