using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using Emgu.CV; using Emgu.CV.Structure; namespace bbiwarg.Images { class DepthImage { public Image Image { get; private set; } public int Width { get; private set; } public int Height { get; private set; } public Int16 MinDepth { get; private set; } public Int16 MaxDepth { get; private set; } public DepthImage(Image image, Int16 minDepth) { Width = image.Width; Height = image.Height; //threshold min&maxDepth MinDepth = minDepth; MaxDepth = (Int16)(MinDepth + 200); // max = minDepth+255 (else it can't fit whole range in byte image) //smooth+threshold Image = image.SmoothMedian(3).Convert(delegate(Int16 depth) { if (depth > MaxDepth || depth < MinDepth) return (byte)(MaxDepth - MinDepth); else return (byte)(depth - MinDepth); }); } 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); } public float getRelativeDepthAt(Point point) { return getRelativeDepthAt(point.X, point.Y); } public float getRelativeDepthAt(int x, int y) { float minMaxInterval = Math.Max(MaxDepth - MinDepth, 1); return (getDepthAt(x, y) - MinDepth) / minMaxInterval; } } }