using BBIWARG.Utility;
using System;
using System.Collections.Generic;
using System.Drawing;
namespace BBIWARG
{
///
/// type of input source
///
public enum InputType
{
RS300,
DS325,
Movie
}
///
/// Defines all parameters used in the whole program.
///
internal static class Parameters
{
#region console
///
/// height of the console in mono space characters
///
public static readonly int ConsoleHeight = 30;
///
/// with of the console in mono space characters
///
public static readonly int ConsoleWidth = 90;
#endregion console
#region input
///
/// path to the movie file used as input source
///
public static readonly String InputMoviePath = "..\\..\\videos\\touch\\4.skv";
///
/// the input source type
///
public static readonly InputType InputSource = InputType.RS300;
#endregion input
#region Logger
///
/// bit field which specifies which subjects should be logged
///
public static readonly LogSubject LoggerEnabledSubjects = LogSubject.None;
///
/// true iff the timer output should be shown
///
public static readonly bool LoggerTimerOutputEnabled = false;
#endregion Logger
#region DebugWindow
///
/// true iff the debug window is enabled
///
public static readonly bool DebugWindowEnabled = true;
///
/// the title of the debug window
///
public static readonly String DebugWindowTitle = "BBIWARG - DebugOutput";
///
/// the update interval for the debug window
///
public static readonly int DebugWindowUpdateIntervall = 1000 / 30; // 30fps
#endregion DebugWindow
#region GlassesWindow
///
/// true iff the glasses window is enabled
///
public static readonly bool GlassesWindowEnabled = false;
///
/// number of calibration points
///
public static readonly int GlassesWindowNumCalibrationPoints = 20;
///
/// the title of the debug window
///
public static readonly String GlassesWindowTitle = "BBIWARG - GlassesOutput";
///
/// the update interval for the glasses window
///
public static readonly int GlassesWindowUpdateInterval = 1000 / 30; // 30fps
#endregion GlassesWindow
#region tuio
///
/// the default ip address of the tuio server
///
public static readonly String TuioDefaultIP = "127.0.0.1";
///
/// the default port of the tuio server
///
public static readonly Int16 TuioDefaultPort = 3336;
///
/// true iff the tuio server is enabled
///
public static readonly bool TuioEnabledByDefault = true;
#endregion tuio
#region ConfidenceImage
///
/// the minimum confidence threshold for pixel values to be considered correct
///
public static readonly int ConfidenceImageMinThreshold = 500;
#endregion ConfidenceImage
#region DepthImage
///
/// the depth range which is considered important (in mm) (must be smaller than 255)
///
public static readonly int DepthImageDepthRange = 254;
///
/// the size of the median filter used to filter the depth image
///
public static readonly int DepthImageMedianSize = 5;
#endregion DepthImage
#region EdgeImage
///
/// linking threshold for the canny edge detector used to detect edges in the depth image
///
public static readonly int EdgeImageCannyLinkingThreshold = 60;
///
/// filter size for the canny edge detector used to detect edges in the depth image
///
public static readonly int EdgeImageCannySize = 3;
///
/// start threshold for the canny edge detector used to detect edges in the depth image
///
public static readonly int EdgeImageCannyStartThreshold = 80;
///
/// number of dilation iterations to generate the rough edge image from the edge image
///
public static readonly int EdgeImageRoughNumDilationIterations = 1;
#endregion EdgeImage
#region general tracking
///
/// if a tracked object moves this relative amount it will have a similarity of 0 to itself at the previous position
///
public static readonly float TrackerMaxRelativeMove = 0.35f;
#endregion general tracking
#region finger detection
///
/// the contour margin around the finger
///
public static readonly int FingerContourMargin = 4;
///
/// the maximum depth difference between the finger and a point beside the finger
///
public static readonly int FingerMaxCrippleDifference = 20;
///
/// the number of missed slices until the trail expansion stops
///
public static readonly int FingerMaxGapCounter = 4;
///
/// the maximum slice length difference of two consecutive slices (used to drop outliers)
///
public static int FingerMaxSliceLengthDifferencePerStep { get { return InputSource == InputType.RS300 ? 20 : 5; } }
///
/// maximum finger slice length (in pixels)
///
public static int FingerMaxWidth2D { get { return InputSource == InputType.RS300 ? 60 : 30; } }
///
/// maximum finger slice length (in mm)
///
public static readonly float FingerMaxWidth3D = 35.0f;
///
/// the minimum number of slices a finger must have
///
public static readonly int FingerMinNumSlices = 15;
// TODO remove and replace with 3Dwidth
///
/// minimum finger slice length (in pixels)
///
public static readonly int FingerMinWidth2D = 2;
///
/// the number of slices used to calculate the start and end directions
///
public static readonly int FingerNumSlicesForRelativeDirection = 10;
///
/// the distance of a point to be considered beside the finger (in pixels)
///
public static readonly int FingerOutMargin = 6;
///
/// the number of slices that are removed when the finger expansion starts in opposite direction (because initial slices don't have the correct direction)
///
public static readonly int FingerRemoveNumSlicesForCorrection = 5;
#endregion finger detection
#region finger tracking
///
/// xx entry for the measurement noise covariance matrix for the kalman filter used to smooth the finger hand and tip points
///
public static readonly float FingermXX = 0.000005f;
///
/// xy and yx entry for the measurement noise covariance matrix for the kalman filter used to smooth the finger hand and tip points
///
public static readonly float FingermXY = 0.0f;
///
/// yy entry for the measurement noise covariance matrix for the kalman filter used to smooth the finger hand and tip points
///
public static readonly float FingermYY = 0.000005f;
///
/// if the hand point of a finger moves this relative amount it will have a similarity of 0 to itself at the previous position
///
public static readonly float FingerTrackerMaxHandPointRelativeMove = TrackerMaxRelativeMove;
///
/// if the tip point of a finger moves this relative amount it will have a similarity of 0 to itself at the previous position
///
public static readonly float FingerTrackerMaxTipPointRelativeMove = TrackerMaxRelativeMove;
///
/// number of finger slice directions used to compute the mean finger direction
///
public static readonly int FingerTrackerNumDirectionsForMeanDirection = 10;
///
/// number of frames a finger needs to be detected before it is tracked
///
public static readonly int FingerTrackerNumFramesDetectedUntilTracked = 5;
///
/// number of frames a finger needs to be lost before it is deleted
///
public static readonly int FingerTrackerNumFramesLostUntilDeleted = 10;
#endregion finger tracking
#region hand detection
///
/// maximum depth difference below which two sections of a hand which are separated by a finger are considered to belong to the same hand
///
public static readonly int HandExtendMaxDifference = 40;
///
/// maximum size of a hand extension mask relative to the whole image
///
public static readonly float HandExtensionMaxRelativeSize = 0.5f * HandMaxSize;
///
/// maximum downwards depth difference between a pixel and a neighboring pixel belonging to the same hand
///
public static int HandFloodFillDownDiff { get { return InputSource == InputType.RS300 ? 1 : 2;}}
///
/// maximum upwards depth difference between a pixel and a neighboring pixel belonging to the same hand
///
public static int HandFloodFillUpDiff { get { return InputSource == InputType.RS300 ? 1 : 2; } }
///
/// maximum size of a hand relative to the whole image
///
public static readonly float HandMaxSize = 0.6f;
///
/// minimum size of a hand relative to the whole image
///
public static readonly float HandMinSize = 0.01f;
///
/// number of colors used to draw hands
///
public static readonly int HandNumColors = 3;
///
/// the maximum distance of the thumb tip point to the outer short point of a convexity defect for possible thumb defects
///
public static readonly float HandThumbDefectMaxDistanceToThumb = Parameters.FingerMaxWidth2D;
///
/// the maximum ratio of the length from the depth point to the outer short point to
/// the length from the depth point to the outer long point of a convexity defect for possible thumb defects
///
public static readonly float HandThumbDefectMaxShortLongLengthRatio = 0.7f;
///
/// the maximum ratio of the thumb length to the length from the depth point to the outer short point of a convexity defect for possible thumb defects
///
public static readonly float HandThumbDefectMaxThumbShortLengthRatio = 1.1f;
///
/// the minimum ratio of the length from the depth point to the outer short point to
/// the length from the depth point to the outer long point of a convexity defect for possible thumb defects
///
public static readonly float HandThumbDefectMinShortLongLengthRatio = 0.3f;
///
/// the minimum ratio of the thumb length to the length from the depth point to the outer short point of a convexity defect for possible thumb defects
///
public static readonly float HandThumbDefectMinThumbShortLengthRatio = 0.6f;
#endregion hand detection
#region hand tracker
///
/// xx entry for the measurement noise covariance matrix for the kalman filter used to smooth the hand centroid
///
public static readonly float HandmXX = 0.0005f;
///
/// xy and yx entry for the measurement noise covariance matrix for the kalman filter used to smooth the hand centroid
///
public static readonly float HandmXY = 0.0f;
///
/// yy entry for the measurement noise covariance matrix for the kalman filter used to smooth the hand centroid
///
public static readonly float HandmYY = 0.0005f;
///
/// if the centroid of a hand moves this relative amount it will have a similarity of 0 to itself at the previous position
///
public static readonly float HandTrackerMaxCentroidRelativeMove = TrackerMaxRelativeMove;
///
/// number of frames a hand needs to be detected before it is tracked
///
public static readonly int HandTrackerNumFramesDetectedUntilTracked = 5;
///
/// number of frames a hand needs to be lost before it is deleted
///
public static readonly int HandTrackerNumFramesLostUntilDeleted = 5;
#endregion hand tracker
#region palm detection
///
/// relative tolerance which specifies when a point is considered to be in the palm grid
///
public static readonly float PalmInsideTolerance = 0.1f;
///
/// number of positions along the forefinger used as starting points to detect the palm width
///
public static readonly int PalmNumPositionsForPalmWidth = 5;
#endregion palm detection
#region palm tracker
///
/// xx entry for the measurement noise covariance matrix for the kalman filter used to smooth the palm grid points
///
public static readonly float PalmmXX = 0.00005f;
///
/// xy and yx entry for the measurement noise covariance matrix for the kalman filter used to smooth the palm grid points
///
public static readonly float PalmmXY = 0.0f;
///
/// yy entry for the measurement noise covariance matrix for the kalman filter used to smooth the palm grid points
///
public static readonly float PalmmYY = 0.00005f;
///
/// if the lower finger point of the palm grid moves this relative amount it will have a similarity of 0 to itself at the previous position
///
public static readonly float PalmTrackerMaxFingersLowerRelativeMove = TrackerMaxRelativeMove;
///
/// if the upper finger point of the palm grid moves this relative amount it will have a similarity of 0 to itself at the previous position
///
public static readonly float PalmTrackerMaxFingersUpperRelativeMove = TrackerMaxRelativeMove;
///
/// if the lower wrist point of the palm grid moves this relative amount it will have a similarity of 0 to itself at the previous position
///
public static readonly float PalmTrackerMaxWristLowerRelativeMove = TrackerMaxRelativeMove;
///
/// if the upper wrist point of the palm grid moves this relative amount it will have a similarity of 0 to itself at the previous position
///
public static readonly float PalmTrackerMaxWristUpperRelativeMove = TrackerMaxRelativeMove;
///
/// number of frames a palm needs to be detected before it is tracked
///
public static readonly int PalmTrackerNumFramesDetectedUntilTracked = 5;
///
/// number of frames a palm needs to be lost before it is deleted
///
public static readonly int PalmTrackerNumFramesLostUntilDeleted = 5;
#endregion palm tracker
#region palm grid
///
/// default number of palm grid columns
///
public static readonly int PalmGridDefaultNumColumns = 4;
///
/// default number of palm grid rows
///
public static readonly int PalmGridDefaultNumRows = 3;
///
/// number of palm slider capacity
///
public static int PalmSliderMax = 10;
///
/// position of palm slider
///
public static int PalmSliderPos = 1;
///
/// current value of palm slider
///
public static int PalmSliderCurr = 0;
///
/// current state of palm slider
///
public static int PalmSliderState = 0;
///
///
///
public static int PalmSliderLastTouched = 0;
#endregion palm grid
#region touch detection
///
/// the size of the quadrant around the touch positions that is used to determine the touch value
///
public static int TouchAreaSize { get { return InputSource == InputType.RS300 ? 60 : 30; }}
///
/// the maximum downwards difference for the flood fill operation
///
public static readonly int TouchFloodfillDownDiff = 2;
///
/// the maximum upwards difference for the flood fill operation
///
public static readonly int TouchFloodfillUpDiff = 3;
///
/// the threshold number of pixels affected by the flood fill (in percentage) to be considered as a touch
///
public static readonly float TouchMinTouchValue = 0.5f;
///
/// the position adjustment for the start point of the flood fill operation
///
public static int TouchTipInsideFactor { get { return InputSource == InputType.RS300 ? 4 : 2; }}
///
/// the position adjustment for the position of the actual touch event
///
public static int TouchTipOutsideFactor { get { return InputSource == InputType.RS300 ? 14 : 7; }}
#endregion touch detection
#region touch tracking
///
/// xx entry for the measurement noise covariance matrix for the kalman filter used to smooth touch events
///
public static readonly float TouchmXX = 0.003f;
///
/// xy and yx entry for the measurement noise covariance matrix for the kalman filter used to smooth touch events
///
public static readonly float TouchmXY = 0.0f;
///
/// yy entry for the measurement noise covariance matrix for the kalman filter used to smooth touch events
///
public static readonly float TouchmYY = 0.003f;
///
/// value used for all entries in the process noise covariance matrix for the kalman filter used to smooth touch events
///
public static readonly float TouchProcessNoise = 3.0e-4f;
///
/// if the absolute position of a tracked touch event moves this relative amount it will have a similarity of 0 to itself at the previous position
///
public static readonly float TouchTrackerMaxAbsolutePositionRelativeMove = TrackerMaxRelativeMove;
///
/// number of frames an object needs to be detected before it is tracked
///
public static readonly int TouchTrackerNumFramesDetectedUntilTracked = 2;
///
/// number of frames an object needs to be lost before it is deleted
///
public static readonly int TouchTrackerNumFramesLostUntilDeleted = 10;
#endregion touch tracking
#region TouchEventVisualizer
///
/// time in milliseconds after which old touch events are removed from the touch event visualizer
///
public static readonly int TouchEventVisualizerFadeOutTime = 1500;
#endregion TouchEventVisualizer
#region homographyExport
///
/// file name of the file to which the homography is written
///
public static readonly String HomographyFileName = "homography.txt";
#endregion homographyExport
#region colors
#region general
///
/// color used to draw detected objects
///
public static readonly Color ColorDetected = Color.Turquoise;
///
/// color used to draw tracked objects
///
public static readonly Color ColorTracked = Color.Yellow;
#endregion general
#region images
///
/// color used to specify which color channels the depth image is drawn to
///
public static readonly Color DepthImageColor = Color.White;
///
/// color used to specify which color channels the edge image is drawn to
///
public static readonly Color EdgeImageColor = Color.Blue;
///
/// color used to draw the borders of the output images
///
public static readonly Color OutputImageBorderColor = Color.White;
#endregion images
#region finger
///
/// color used to draw the finger contour
///
public static readonly Color FingerContourColor = Color.Red;
///
/// color used to draw the detected fingers
///
public static readonly Color FingerDetectedColor = ColorDetected;
///
/// color used to draw the finger hand point
///
public static readonly Color FingerHandColor = Color.Yellow;
///
/// color used to draw the text for the finger id
///
public static readonly Color FingerIDColor = Color.White;
///
/// color used to draw the finger slices
///
public static readonly Color FingerSliceColor = Color.Magenta;
///
/// color used to draw the finger tip point
///
public static readonly Color FingerTipColor = Color.Blue;
///
/// color used to draw the tracked fingers
///
public static readonly Color FingerTrackedColor = ColorTracked;
#endregion finger
#region touch
///
/// color used to draw detected touch events
///
public static readonly Color TouchEventDetectedColor = ColorDetected;
///
/// color used to draw tracked touch events
///
public static readonly Color TouchEventTrackedColor = ColorTracked;
///
/// all touched buttons
///
///
public static List> ActiveTouches;
#endregion touch
#region TouchEventVisualizer
///
/// color used to highlight the active block in the touch event visualizer
///
public static readonly Color TouchEventVisualizerActiveBlockColor = Color.DarkSlateGray;
///
/// color used to draw the grid in the touch event visualizer
///
public static readonly Color TouchEventVisualizerGridColor = Color.White;
///
/// color used to draw the lines between touch events in the touch event visualizer
///
public static readonly Color TouchEventVisualizerLineColor = Color.Yellow;
///
/// color used to draw the touch event points in the touch event visualizer
///
public static readonly Color TouchEventVisualizerPointColor = Color.Red;
///
/// color used to draw the text in the touch event visualizer
///
public static readonly Color TouchEventVisualizerTextColor = Color.White;
#endregion TouchEventVisualizer
#region palm
///
/// color used to draw the palm grid in the palm
///
public static readonly Color PalmGridColor = Color.CornflowerBlue;
///
/// color used to draw the palm quadrangle
///
public static readonly Color PalmQuadColor = Color.Blue;
#endregion palm
#region hand
///
/// color used to draw the hand centroid
///
public static readonly Color HandCentroidColor = Color.Yellow;
///
/// colors used to draw the hands (element is a color which specifies the color channels used to draw the hand)
///
public static readonly Color[] HandColors = new Color[3] { Color.Red, Color.Blue, Color.Green };
///
/// color used to draw the hand id text
///
public static readonly Color HandIDColor = Color.White;
///
/// color used to draw the lines of the thumb defects
///
public static readonly Color HandThumbDefectLineColor = Color.CornflowerBlue;
///
/// color used to draw the points of the thumb defects
///
public static readonly Color HandThumbDefectPointColor = Color.Lime;
#endregion hand
#region calibration
///
/// color used to draw the calibration points in the glasses window
///
public static readonly Color CalibrationPointColor = Color.Yellow;
#endregion calibration
#endregion colors
}
}