using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using Emgu.CV; using Emgu.CV.Structure; using bbiwarg.Graphics; using bbiwarg.Recognition.FingerRecognition; using bbiwarg.Recognition.HandRecognition; using bbiwarg.Utility; namespace bbiwarg.Images { class DepthImage { public Image Image { get; private set; } public Image BackgroundMask { get; private set; } public int Width { get; private set; } public int Height { get; private set; } public Vector2D BottomRight { get; private set; } public Int16 MinDepth { get; private set; } public Int16 MaxDepth { get; private set; } public DepthImage(Image image) { Width = image.Width; Height = image.Height; BottomRight = new Vector2D(Width - 1, Height - 1); image = image.SmoothMedian(Constants.DepthImageMedianSize); //threshold min&maxDepth MinDepth = findMinDepth(image); MaxDepth = (Int16)(MinDepth + Constants.DepthImageDepthRange); //smooth+threshold (dst = (src > (MaxDepth - MinDepth)) ? MaxDepth - MinDepth : src) Image = (image - MinDepth).ThresholdTrunc(new Gray(MaxDepth - MinDepth)).Convert(); Image = Image.SmoothMedian(Constants.DepthImageMedianSize); } public Int16 getDepthAt(Point point) { return getDepthAt(point.X, point.Y); } public Int16 getDepthAt(int x, int y) { return (Int16)(MinDepth + Image.Data[y, x, 0]); } public void setDepthAt(Point point, Int16 depth) { setDepthAt(point.X, point.Y, depth); } public void setDepthAt(int x, int y, Int16 depth) { Image.Data[y, x, 0] = (byte)(depth - MinDepth); } private Int16 findMinDepth(Image image) { // min and max values double[] min, max; // min and max locations Point[] minLoc, maxLoc; image.MinMax(out min, out max, out minLoc, out maxLoc); return (Int16)min[0]; } } }