public MainForm() { InitializeComponent(); initCameraThread(); initGC(); initFpsUpdater(); _garbageCollector.Start(); _depthSensorThread.Start(); void initCameraThread() { _guiUpdater.Update += new EventHandler <ThreadService>((o, service) => { var frame = new Mat(); short[,] depthMap = _depthSensorThread.GetDepthMap(); if (depthMap != null) { var mat = new MatOfByte3(480, 640); var indexer = mat.GetIndexer(); //short maxValue = 1; //foreach (short value in depthMap) //{ // if (Math.Abs(value) < 20000 && value > maxValue) // { // maxValue = value; // } //} //maxValue = 1500; for (int row = 0; row < 480; row++) { for (int col = 0; col < 640; col++) { var pixel = indexer[row, col]; short value = depthMap[row / 2, col / 2]; pixel.Item0 = (byte)(value / 3 % 256); pixel.Item1 = 255; pixel.Item2 = 255;//(byte)(255 - value * 220 / maxValue); if (Math.Abs(value) > 20000) { pixel.Item1 = 0; pixel.Item2 = 0; } indexer[row, col] = pixel; } } Cv2.CvtColor(mat, mat, ColorConversionCodes.HSV2BGR); BeginInvoke(new MethodInvoker(() => { PictureBox_DepthMap.Image = mat.ToBitmap(); })); } if (_capture.Read(frame) && frame.Width > 0) { //Cv2.Flip(frame, frame, FlipMode.Y); //frame = AlterMat(frame); BeginInvoke(new MethodInvoker(() => { string[] oldInfo = Label_FrameInfo.Text.Split(' '); string fpsInfo = oldInfo.Length > 1 ? oldInfo[1] : "?"; Label_FrameInfo.Text = $"{frame.Width}x{frame.Height} {fpsInfo}"; PictureBox_Camera.Image = frame.ToBitmap(); })); _framesCounter.Update(); } }); _guiUpdater.ThreadCompleted += new EventHandler <ThreadService>((o, service) => { BeginInvoke(new MethodInvoker(() => { PictureBox_Camera.Image = null; })); _framesCounter.Reset(); Label_FrameInfo.Text = "N/A"; }); _guiUpdater.UpdateInterval = 0; } void initGC() { _garbageCollector.Update += new EventHandler <ThreadService>((obj, service) => { GC.Collect(); }); _garbageCollector.UpdateInterval = 1000; } void initFpsUpdater() { _fpsUpdater.Update += new EventHandler <ThreadService>((obj, service) => { BeginInvoke(new MethodInvoker(() => { int fps = _framesCounter.GetFps(); if (fps != -1) { string[] oldInfo = Label_FrameInfo.Text.Split(' '); string resInfo = oldInfo.Length > 0 ? oldInfo[0] : "?x?"; Label_FrameInfo.Text = $"{resInfo} {fps}"; } })); }); _fpsUpdater.UpdateInterval = 500; } }