// thread safe wrt. Push internal Emgu.CV.UMat Pop() { Emgu.CV.UMat ret = null; if (ImageQueue.TryDequeue(out ret)) { return(ret); } return(null); }
public void StartDetect() { Task.Run(() => { Task.Run(() => { while (true) { Console.WriteLine("计算: " + FrameCount + " 采集: " + CapCount + "显示: " + DispCount + " 图片队列: " + ImageQueue.Count); FrameCount = 0; CapCount = 0; DispCount = 0; CurrentLoopCount = serialComm.LoopCount; Thread.Sleep(1000); } }); AlgorithmResult[] algorithmResults; while (DetectFlag) { Task.Run(() => { Image <Bgr, byte> image; if (ImageQueue.TryDequeue(out image)) { stDetectParam = DetectParam.GetSt(); AlarmRecord.SetRange(AlarmParam.PixelRange, AlarmParam.YRange); App.Current?.Dispatcher?.Invoke(() => { if (AlarmRecord.TotalLoopCount != AlarmParam.TotalLoopCount) { AlarmRecord.TotalLoopCount = AlarmParam.TotalLoopCount; Alarms.Clear(); AsyncSaveObject("Alarms", Alarms); } }); algorithmResults = Algorithm.DetectImage(image.Ptr, stDetectParam); List <AlgorithmResult> results = new List <AlgorithmResult>(algorithmResults); results.ForEach(result => { if (result.bStop != 0 || result.bWidthReachStop != 0) { DrawRectOnScreen(result.xPos, result.yPos); AddResultToStatistics(result.xPos, result.yPos, image.Clone()); } }); lock (this) { if (detectResultStatistics.Count > 0) { int avgX = 0; int avgY = 0; DateTime beginTime = DateTime.MinValue; DetectResultStatistic detectResultStatistic = null; TimeSpan maxDuration = FindMaxDuration(out avgX, out avgY, out beginTime, out detectResultStatistic); if (avgX == -1) { return; } float length = (float)((maxDuration.Seconds + maxDuration.Milliseconds / 1000.0) * AlarmParam.Velocity); DateTime latestTime = FindLatestTime(); if (DateTime.Now - latestTime > AlarmParam.MaxErrorTime) { DetectState = DetectResultState.皮带正常; AlarmHeadFlag = true; AlarmRecord.LoopOffset = LoopOffset; if (SaveFlag) { SaveFlag = false; SaveAlarmVideo(); } detectResultStatistics.Clear(); } else if (maxDuration > AlarmParam.MaxHurtTime)//逻辑判断有超过maxHurtTime时间,此时发生撕伤警报 { DetectState = DetectResultState.撕伤; AddAlarmToStatistics(avgX, avgY, length, detectResultStatistic); } else if (maxDuration > AlarmParam.MaxDivTime)//逻辑判断有超过maxDivTime时间,此时发生撕裂警报 { DetectState = DetectResultState.撕裂; } } } FrameCount++; } }); Thread.Sleep(10); } }); }