Ejemplo n.º 1
0
        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);
                }
            });
        }