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); } } }
internal static extern int DetectImageGpu(int rows, int cols, int type, IntPtr data, ref BboxContainer container);