示例#1
0
        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;
            }
        }