예제 #1
0
        private void ProcessFrames()
        {
            WaitHandle[] exitOrRetry = new WaitHandle[] { _stopEvent, _gotNewFrameEvent };

            while (!_stopEvent.WaitOne(0))
            {
                if (_gotNewFrameEvent.WaitOne(0))
                {
                    _readyEvent.Reset();
                    _gotNewFrameEvent.Reset();

                    BboxContainer container = new BboxContainer();
                    int           CV_8UC3   = 16; // OpenCV constant
                    int           count     = DetectImageGpu(_frame.Rows, _frame.Cols, CV_8UC3, _frame.DataPointer, ref container);
                    _statFrameCounter++;

                    if (_statFrameCounter > 24)
                    {
                        DateTime now = DateTime.Now;
                        double   fps = _statFrameCounter / now.Subtract(_statPrevCall).TotalSeconds;
                        Debug.WriteLine($"FPS: {fps:F1} skipped: {100.0 * _statFrameCounter / _statFramesTotal:F0}%");
                        _statFrameCounter = 0;
                        _statFramesTotal  = 0;
                        _statPrevCall     = now;
                    }

                    ObjectsOut?.Invoke(this, container.candidates.Where(b => (b.w > 0) && (b.h > 0)).Select(bt => new BboxItem(bt)));

                    _readyEvent.Set();
                }
                else
                {
                    WaitHandle.WaitAny(exitOrRetry, 100);
                }
            }
        }
예제 #2
0
 internal static extern int DetectImageGpu(int rows, int cols, int type, IntPtr data, ref BboxContainer container);