|
|
@@ -1,5 +1,6 @@
|
|
|
using MvCameraControl;
|
|
|
using MvvmScaffoldFrame48.DLL.LogTools;
|
|
|
+using MvvmScaffoldFrame48.DLL.SystemTools;
|
|
|
using MvvmScaffoldFrame48.DLL.ThreadManager;
|
|
|
using MvvmScaffoldFrame48.Model.StorageModel.ImageAlgorithm.ShuLI;
|
|
|
using System;
|
|
|
@@ -22,6 +23,12 @@ namespace MvvmScaffoldFrame48.DLL.ImageAlgorithm
|
|
|
private long currentLine = 0; //行数记录
|
|
|
private int ObjectNum = 0;
|
|
|
private int ChannelWidth = 0;//每个区域的宽度
|
|
|
+ public int HistoryNum { get { return _HistoryNum; } }
|
|
|
+ private int _HistoryNum = 0;
|
|
|
+ public int HistoryOkNum { get { return _HistoryOkNum; } }
|
|
|
+ private int _HistoryOkNum = 0;
|
|
|
+ public int HistoryNgNum { get { return _HistoryNgNum; } }
|
|
|
+ private int _HistoryNgNum = 0;
|
|
|
private ShuLiConfigClassModel shuLiConfig = new ShuLiConfigClassModel();
|
|
|
public List<int> ChannelsRoi { get { return _ChannelsRoi; } }
|
|
|
private List<int> _ChannelsRoi = new List<int>();
|
|
|
@@ -43,7 +50,7 @@ namespace MvvmScaffoldFrame48.DLL.ImageAlgorithm
|
|
|
throw new NotImplementedException();
|
|
|
}
|
|
|
|
|
|
- public object ProcessImage(IImage imageData, int cameraId)
|
|
|
+ public object ProcessImage(IFrameOut imageData, int cameraId)
|
|
|
{
|
|
|
bool result = ProcessImageSequence(imageData, out List<ActiveObjectClassModel> resultValue);
|
|
|
if (result)
|
|
|
@@ -63,10 +70,10 @@ namespace MvvmScaffoldFrame48.DLL.ImageAlgorithm
|
|
|
/// <param name="ImageWidth">图像宽</param>
|
|
|
/// <param name="currentLine">当前行数</param>
|
|
|
/// <returns>检测到的物体总数</returns>
|
|
|
- public bool ProcessImageSequence(IImage image,out List<ActiveObjectClassModel> resultValue)
|
|
|
+ public bool ProcessImageSequence(IFrameOut image,out List<ActiveObjectClassModel> resultValue)
|
|
|
{
|
|
|
bool result = false;
|
|
|
- for (int i = 0; i < image.Height; i++)
|
|
|
+ for (int i = 0; i < image.Image.Height; i++)
|
|
|
{
|
|
|
ProcessLine(image, i);
|
|
|
currentLine += 1;
|
|
|
@@ -76,6 +83,7 @@ namespace MvvmScaffoldFrame48.DLL.ImageAlgorithm
|
|
|
lostObjects = activeObjects
|
|
|
.Where(o => (currentLine - o.LastSeenLine) > shuLiConfig.MAX_GAP || (o.LastSeenLine - o.StartLine) > shuLiConfig.MAX_Idetify_Height)
|
|
|
.ToList();
|
|
|
+ lostObjects.ForEach(o => activeObjects.Remove(o));
|
|
|
|
|
|
resultValue = new List<ActiveObjectClassModel>();
|
|
|
|
|
|
@@ -92,10 +100,16 @@ namespace MvvmScaffoldFrame48.DLL.ImageAlgorithm
|
|
|
continue;
|
|
|
}
|
|
|
//转为历史物体,添加缺少的参数
|
|
|
- item.Num = Interlocked.Increment(ref ObjectNum) + 1;
|
|
|
+ item.Num = Interlocked.Increment(ref ObjectNum);
|
|
|
//item.ChannelNO = ActiveChannel(item);
|
|
|
item.EndCheckTime = DateTime.Now;
|
|
|
item.MaxLength = GetActionMaxLength(item.RowsData);
|
|
|
+ item.PictureEndReadTime = TimeStampTools.FromUnixTimestamp((long)image.HostTimeStamp);
|
|
|
+ var QutuYanshiTime = (DateTime.Now - item.PictureEndReadTime).TotalMilliseconds;
|
|
|
+ if (QutuYanshiTime > 30)
|
|
|
+ {
|
|
|
+ Console.WriteLine($"结果输出延时超过了30ms,耗时{QutuYanshiTime}");
|
|
|
+ }
|
|
|
if ((item.LastSeenLine - item.StartLine) > shuLiConfig.MAX_Idetify_Height)
|
|
|
{
|
|
|
item.StateCode = 7;
|
|
|
@@ -168,8 +182,6 @@ namespace MvvmScaffoldFrame48.DLL.ImageAlgorithm
|
|
|
|
|
|
// 累加到总数并从活跃物体转移到历史物体
|
|
|
resultValue.ForEach(o => TryAdd(historyActiveObjects, o, 2500));
|
|
|
- //lostObjects.Where(o => o.StateCode != 7 && o.StateCode != 9).ToList().ForEach(o => TryAdd(historyActiveObjects, o, 2500));
|
|
|
- lostObjects.ForEach(o => activeObjects.Remove(o));
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
@@ -180,16 +192,16 @@ namespace MvvmScaffoldFrame48.DLL.ImageAlgorithm
|
|
|
/// 返回值为true的时候有活跃物体转变为历史物体
|
|
|
/// </summary>
|
|
|
/// <param name="image">当前行像素数组</param>
|
|
|
- private bool ProcessLine(IImage imagedata, int RowNo)
|
|
|
+ private bool ProcessLine(IFrameOut imagedata, int RowNo)
|
|
|
{
|
|
|
Stopwatch stopwatch = Stopwatch.StartNew();
|
|
|
bool result = false;
|
|
|
// 步骤1:检测当前行的有效区域
|
|
|
- var currentRegions = FindValidRegions(imagedata, RowNo);
|
|
|
+ var currentRegions = FindValidRegions(imagedata.Image, RowNo);
|
|
|
|
|
|
if (currentRegions.Count == 1)
|
|
|
{
|
|
|
- if (currentRegions[0].End - (currentRegions[0]).Start + 1 == imagedata.Width)
|
|
|
+ if (currentRegions[0].End - (currentRegions[0]).Start + 1 == imagedata.Image.Width)
|
|
|
{
|
|
|
if (!IsPrintLightOnError)
|
|
|
{
|
|
|
@@ -231,6 +243,7 @@ namespace MvvmScaffoldFrame48.DLL.ImageAlgorithm
|
|
|
LastSeenLineEndCol = matcheds.Max(o => o.LastSeenLineEndCol),
|
|
|
StartCheckTime = matcheds.Min(o => o.StartCheckTime),
|
|
|
EndCheckTime = matcheds.Max(o => o.EndCheckTime),
|
|
|
+ PictureStartReadTime = matcheds.Min(o=>o.PictureStartReadTime),
|
|
|
Area = matcheds.Sum(o => o.Area),
|
|
|
RowsData = CopeRowsData,
|
|
|
ImageWidth = matcheds.FirstOrDefault().ImageWidth,
|
|
|
@@ -264,26 +277,27 @@ namespace MvvmScaffoldFrame48.DLL.ImageAlgorithm
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- // 创建新物体(首次出现的区域)
|
|
|
- activeObjects.Add(new ActiveObjectClassModel
|
|
|
- {
|
|
|
- MinStartCol = region.Start,
|
|
|
- MaxEndCol = region.End,
|
|
|
- StartLine = currentLine,
|
|
|
- LastSeenLine = currentLine,
|
|
|
- LastSeenLineStartCol = region.Start,
|
|
|
- LastSeenLineEndCol = region.End,
|
|
|
- StartCheckTime = DateTime.Now,
|
|
|
- Area = region.End - region.Start + 1,
|
|
|
- ImageWidth = shuLiConfig.ImageWidth,
|
|
|
- RowsData = new List<RowStartEndColModel> {
|
|
|
+ // 创建新物体(首次出现的区域)
|
|
|
+ activeObjects.Add(new ActiveObjectClassModel
|
|
|
+ {
|
|
|
+ MinStartCol = region.Start,
|
|
|
+ MaxEndCol = region.End,
|
|
|
+ StartLine = currentLine,
|
|
|
+ LastSeenLine = currentLine,
|
|
|
+ LastSeenLineStartCol = region.Start,
|
|
|
+ LastSeenLineEndCol = region.End,
|
|
|
+ StartCheckTime = DateTime.Now,
|
|
|
+ PictureStartReadTime = TimeStampTools.FromUnixTimestamp((long)imagedata.HostTimeStamp),
|
|
|
+ Area = region.End - region.Start + 1,
|
|
|
+ ImageWidth = shuLiConfig.ImageWidth,
|
|
|
+ RowsData = new List<RowStartEndColModel> {
|
|
|
new RowStartEndColModel {
|
|
|
StartCol = region.Start,
|
|
|
EndCol = region.End,
|
|
|
RowsCol = currentLine,
|
|
|
}
|
|
|
}
|
|
|
- });
|
|
|
+ });
|
|
|
}
|
|
|
}
|
|
|
//}
|
|
|
@@ -385,12 +399,28 @@ namespace MvvmScaffoldFrame48.DLL.ImageAlgorithm
|
|
|
return !(region.End < obj.LastSeenLineStartCol || region.Start > obj.LastSeenLineEndCol);
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 历史数据队列添加数据
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="list">历史数据队列</param>
|
|
|
+ /// <param name="item">添加的数据</param>
|
|
|
+ /// <param name="maxSize">队列最大数据量</param>
|
|
|
+ /// <returns></returns>
|
|
|
private bool TryAdd(List<ActiveObjectClassModel> list, ActiveObjectClassModel item, int maxSize)
|
|
|
{
|
|
|
list.Add(item);
|
|
|
+ Interlocked.Increment(ref _HistoryNum);
|
|
|
+ if(item.StateCode == 0)
|
|
|
+ {
|
|
|
+ Interlocked.Increment(ref _HistoryOkNum);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ Interlocked.Increment(ref _HistoryNgNum);
|
|
|
+ }
|
|
|
if (list.Count > maxSize)
|
|
|
{
|
|
|
- list[list.Count - maxSize].RowsData.Clear();
|
|
|
+ list.Remove(list[list.Count - maxSize]);
|
|
|
}
|
|
|
return true;
|
|
|
}
|