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);
        }
Beispiel #2
0
        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;
        }