コード例 #1
0
        public (double CoordinateX, double CoordinateY) Predict(HeadPoseAndGaze data)
        {
            var camera                  = new CoordinateSystem();
            var displayNormRealign      = UnitVector3D.YAxis;
            var displayXPositiveRealign = UnitVector3D.XAxis;

            var refHeadPositionRaw   = Point3D.Centroid(Samples.Select(r => r.HeadPose.Position));
            var refHeadPosition      = ConvertPointFromOpenFaceSpaceToMathNetSpace(refHeadPositionRaw);
            var refHeadRotationRaw   = Point3D.Centroid(Samples.Select(r => r.HeadPose.Angle));
            var refHeadRotation      = ConvertAngelFromOpenFaceSpaceToMathNetSpace(refHeadRotationRaw);
            var refHeadRotationCoord = camera
                                       .RotateCoordSysAroundVector(UnitVector3D.XAxis, Angle.FromRadians(refHeadRotation.X))
                                       .RotateCoordSysAroundVector(UnitVector3D.ZAxis, Angle.FromRadians(refHeadRotation.Z))
                                       .RotateCoordSysAroundVector(UnitVector3D.YAxis, Angle.FromRadians(refHeadRotation.Y));
            var refHeadRotationAlign   = CoordinateSystem.CreateMappingCoordinateSystem(camera, refHeadRotationCoord);
            var refHeadRotationUnalign = CoordinateSystem.CreateMappingCoordinateSystem(refHeadRotationCoord, camera);

            var displayWidth  = HeadDisplayDistance * Tan(FieldOfViewWidthSingleSideAngle) * 2;
            var displayHeight = displayWidth / DisplayAspectRatio;
            var displaySize   = new Vector2D(displayWidth, displayHeight);

            var refDisplayNorm      = displayNormRealign.TransformBy(refHeadRotationUnalign).Normalize();
            var refDisplayXPositive = displayXPositiveRealign.TransformBy(refHeadRotationUnalign).Normalize();
            var refDisplayCentroid  = refHeadPosition + HeadDisplayDistance * refDisplayNorm;
            var refDisplayPlane     = new Plane(refDisplayCentroid, refDisplayNorm);

            var headPosition      = ConvertPointFromOpenFaceSpaceToMathNetSpace(data.HeadPose.Position);
            var headRotation      = ConvertAngelFromOpenFaceSpaceToMathNetSpace(data.HeadPose.Angle);
            var headRotationCoord = camera
                                    .RotateCoordSysAroundVector(UnitVector3D.XAxis, Angle.FromRadians(headRotation.X))
                                    .RotateCoordSysAroundVector(UnitVector3D.ZAxis, Angle.FromRadians(headRotation.Z))
                                    .RotateCoordSysAroundVector(UnitVector3D.YAxis, Angle.FromRadians(headRotation.Y));
            var headRotationAlign   = CoordinateSystem.CreateMappingCoordinateSystem(camera, headRotationCoord);
            var headRotationUnalign = CoordinateSystem.CreateMappingCoordinateSystem(headRotationCoord, camera);

            var displayNorm      = displayNormRealign.TransformBy(headRotationUnalign).Normalize();
            var displayXPositive = displayXPositiveRealign.TransformBy(headRotationUnalign).Normalize();
            var displayCentroid  = headPosition + HeadDisplayDistance * displayNorm;
            var displayPlane     = new Plane(displayCentroid, displayNorm);

            var calibPoints            = Samples.Select(r => CalibPointOnDisplay(displayCentroid, displayNorm, displayXPositive, displaySize, r.Display)).ToArray();
            var calibRays              = calibPoints.Select(p => new Ray3D(headPosition, p - headPosition)).ToArray();
            var transformedCalibPoints = calibRays.Select(r => (Point3D)r.IntersectionWith(refDisplayPlane)).ToArray();
            var transformedRelatives   = transformedCalibPoints.Select(p => RelativeToDisplay(refDisplayCentroid, refDisplayNorm, refDisplayXPositive, displaySize, p)).ToArray();

            var pupilDistances = Samples.Select(r => PupilCornerDistance(r.Gaze, r.HeadPose)).ToArray();
            var inputX         = pupilDistances.Select(d => d.X).ToArray();
            var outputX        = transformedRelatives.Select(p => p.X).ToArray();
            var polynomialX    = Polynomial.Fit(inputX, outputX, Order);
            var inputY         = pupilDistances.Select(d => d.Y).ToArray();
            var outputY        = transformedRelatives.Select(p => p.Y).ToArray();
            var polynomialY    = Polynomial.Fit(inputY, outputY, Order);

            var distance = PupilCornerDistance(data.Gaze, data.HeadPose);
            var x        = polynomialX.Evaluate(distance.X);
            var y        = polynomialY.Evaluate(distance.Y);

            return(x, y);
        }
コード例 #2
0
        public (double CoordinateX, double CoordinateY) Predict(HeadPoseAndGaze data)
        {
            var record = new RegressionRecord(data);
            var predX  = predictorX.Predict(record);
            var predY  = predictorY.Predict(record);

            return(predX.Value, predY.Value);
        }
コード例 #3
0
ファイル: Record.cs プロジェクト: sandrist/OpenSense
 public Record(HeadPoseAndGaze headPoseAndGaze, Point2D display) : this(headPoseAndGaze.Gaze, headPoseAndGaze.HeadPose, display)
 {
 }