| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423 |
- using MvvmScaffoldFrame48.Model.StorageModel.ImageAlgorithm;
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Xml;
- using VisionDesigner;
- using VisionDesigner.MVDCNNDetect;
- namespace MvvmScaffoldFrame48.DLL.ImageAlgorithm
- {
- public class CPUDeepObjectDetectClass
- {
- private CNNDetectTool m_stCNNDetectToolObj = null;
- private CMvdXmlParseTool m_stXmlParseToolObj = null;
- private CMvdImage m_stInputImage = null;
- List<CMvdRectangleF> m_lBlobBoxRender1 = new List<CMvdRectangleF>();
- private CMvdShape m_stROIShape = null;
- private MVD_ALGORITHM_PLATFORM_TYPE m_enPlatformType = MVD_ALGORITHM_PLATFORM_TYPE.MVD_ALGORITHM_PLATFORM_CPU;
- MVD_CNN_CROP_TYPE m_enCropRoiType = MVD_CNN_CROP_TYPE.MVD_CNN_ROI_TYPE_NORMAL;
- MVD_CNN_PREDICT_MODE m_enPredictMode = MVD_CNN_PREDICT_MODE.MVD_CNN_PREDICT_NORMAL;
- public CPUDeepObjectDetectClass()
- {
- m_stCNNDetectToolObj = new CNNDetectTool(m_enPlatformType);
- byte[] fileBytes = new byte[256];
- uint nConfigDataSize = 256;
- uint nConfigDataLen = 0;
- try
- {
- m_stCNNDetectToolObj.SaveConfiguration(fileBytes, nConfigDataSize, ref nConfigDataLen);
- }
- catch (MvdException ex)
- {
- if (MVD_ERROR_CODE.MVD_E_NOENOUGH_BUF == ex.ErrorCode)
- {
- fileBytes = new byte[nConfigDataLen];
- nConfigDataSize = nConfigDataLen;
- m_stCNNDetectToolObj.SaveConfiguration(fileBytes, nConfigDataSize, ref nConfigDataLen);
- }
- else
- {
- throw ex;
- }
- }
- UpdateParamList(fileBytes, nConfigDataLen);
- }
- /// <summary>
- /// 加载图片
- /// </summary>
- /// <param name="LoadImagePath"></param>
- public void LoadImage(string LoadImagePath)
- {
- try
- {
- if (!string.IsNullOrEmpty(LoadImagePath))
- {
- if (null == m_stInputImage)
- {
- m_stInputImage = new CMvdImage();
- }
- m_stInputImage.InitImage(LoadImagePath);
- m_stROIShape = null;
- m_lBlobBoxRender1.Clear();
- Console.WriteLine("Finish loading image from [" + LoadImagePath + "].");
- }
- }
- catch (MvdException ex)
- {
- Console.WriteLine("Fail to load image from [" + LoadImagePath + "]. ErrorCode: 0x" + ex.ErrorCode.ToString("X"));
- }
- catch (Exception ex)
- {
- Console.WriteLine("Fail to load image from [" + LoadImagePath + "]. Error: " + ex.Message);
- }
- }
- /// <summary>
- /// 加载图片
- /// </summary>
- /// <param name="bitmap"></param>
- public void LoadImage(Bitmap bitmap)
- {
- try
- {
- if (bitmap != null)
- {
- if (null == m_stInputImage)
- {
- m_stInputImage = new CMvdImage();
- }
- //m_stInputImage.InitImage(bitmap);
- HikVisionAlgorithmRelated.ConvertBitmap2MVDImage(bitmap, m_stInputImage);
- m_stROIShape = null;
- m_lBlobBoxRender1.Clear();
- Console.WriteLine("Finish loading image from [BitMap].");
- }
- }
- catch (MvdException ex)
- {
- Console.WriteLine("Fail to load image from [BitMap]. ErrorCode: 0x" + ex.ErrorCode.ToString("X"));
- }
- catch (Exception ex)
- {
- Console.WriteLine("Fail to load image from [BitMap]. Error: " + ex.Message);
- }
- }
- /// <summary>
- /// 加载模型
- /// </summary>
- public void LoadDeepModel(string modelPath)
- {
- try
- {
- if (!string.IsNullOrEmpty(modelPath))
- {
- m_stCNNDetectToolObj.BasicParam.LoadModel(modelPath);
- Console.WriteLine("Finish loading model from [" + modelPath + "].");
- }
- }
- catch (MvdException ex)
- {
- Console.WriteLine("Fail to load model from [" + modelPath + "]. ErrorCode: 0x" + ex.ErrorCode.ToString("X"));
- }
- catch (System.Exception ex)
- {
- Console.WriteLine("Fail to load model from [" + modelPath + "]. Error: " + ex.Message);
- }
- }
- /// <summary>
- /// 运行检测
- /// </summary>
- public List<CNNDetectPredInfo> RunDetect()
- {
- List<CNNDetectPredInfo> Result = new List<CNNDetectPredInfo>();
- try
- {
- if ((null == m_stCNNDetectToolObj) || (null == m_stInputImage))
- {
- throw new MvdException(MVD_MODULE_TYPE.MVD_MODUL_APP, MVD_ERROR_CODE.MVD_E_CALLORDER);
- }
- m_stCNNDetectToolObj.InputImage = m_stInputImage;
- if (null == m_stROIShape)
- {
- m_stCNNDetectToolObj.ROI = new VisionDesigner.CMvdRectangleF(m_stInputImage.Width / 2, m_stInputImage.Height / 2, m_stInputImage.Width, m_stInputImage.Height);
- }
- else
- {
- m_stCNNDetectToolObj.ROI = m_stROIShape;
- }
- //设置基本参数
- m_stCNNDetectToolObj.BasicParam.PredictMode = m_enPredictMode;
- m_stCNNDetectToolObj.BasicParam.RoiCropType = m_enCropRoiType;
- m_stCNNDetectToolObj.BasicParam.SODParam.Col = Convert.ToUInt32(1);
- m_stCNNDetectToolObj.BasicParam.SODParam.Row = Convert.ToUInt32(1);
- m_stCNNDetectToolObj.BasicParam.SODParam.Overlap = Convert.ToSingle(0.01);
- m_stCNNDetectToolObj.BasicParam.BatchSize = Convert.ToInt32(4);
- m_stCNNDetectToolObj.BasicParam.BatchSizeEnable = false;
- if (m_enPlatformType != MVD_ALGORITHM_PLATFORM_TYPE.MVD_ALGORITHM_PLATFORM_GPU)
- {
- m_stCNNDetectToolObj.BasicParam.BatchSizeEnable = false;
- }
- m_stCNNDetectToolObj.SetRunParam("MaxObjNum", "100");
- m_stCNNDetectToolObj.Run();
- if (0 != m_lBlobBoxRender1.Count)
- {
- m_lBlobBoxRender1.Clear();
- }
- Console.WriteLine("Obj Num : " + m_stCNNDetectToolObj.Result.PredInfoList.Count);
- Result = m_stCNNDetectToolObj.Result.PredInfoList;
- foreach (var item in m_stCNNDetectToolObj.Result.PredInfoList)
- {
- CMvdRectangleF ObjBox = new CMvdRectangleF(item.Box.CenterX, item.Box.CenterY, item.Box.Width, item.Box.Height);
- ObjBox.Angle = item.Box.Angle;
- ObjBox.BorderColor = new MVD_COLOR(0, 255, 0, 255);
- m_lBlobBoxRender1.Add(ObjBox);
- }
- }
- catch (MvdException ex)
- {
- Console.WriteLine("Fail to execute algorithm tool. nRet = 0x" + ex.ErrorCode.ToString("X") + ". " + ex.Message.ToString());
- }
- catch (System.Exception ex)
- {
- Console.WriteLine(ex.Message + ex.Source + ex.StackTrace);
- }
- return Result;
- }
- /// <summary>
- /// Update paramters
- /// </summary>
- /// <param name="bufXml"></param>
- /// <param name="nXmlLen"></param>
- private void UpdateParamList(Byte[] bufXml, uint nXmlLen)
- {
- if (null == m_stXmlParseToolObj)
- {
- m_stXmlParseToolObj = new CMvdXmlParseTool(bufXml, nXmlLen);
- }
- else
- {
- m_stXmlParseToolObj.UpdateXmlBuf(bufXml, nXmlLen);
- }
- for (int i = 0; i < m_stXmlParseToolObj.IntValueList.Count; ++i)
- {
- Console.WriteLine("{0}:{1}", m_stXmlParseToolObj.IntValueList[i].Description, m_stXmlParseToolObj.IntValueList[i].CurValue);
- }
- for (int i = 0; i < m_stXmlParseToolObj.EnumValueList.Count; ++i)
- {
- Console.WriteLine("{0}:{1}", m_stXmlParseToolObj.EnumValueList[i].Description, m_stXmlParseToolObj.EnumValueList[i].CurValue.Name);
- }
- for (int i = 0; i < m_stXmlParseToolObj.FloatValueList.Count; ++i)
- {
- Console.WriteLine("{0}:{1}", m_stXmlParseToolObj.FloatValueList[i].Description, m_stXmlParseToolObj.FloatValueList[i].CurValue);
- }
- for (int i = 0; i < m_stXmlParseToolObj.BooleanValueList.Count; ++i)
- {
- Console.WriteLine("{0}:{1}", m_stXmlParseToolObj.BooleanValueList[i].Description, m_stXmlParseToolObj.BooleanValueList[i].CurValue.ToString());
- }
- }
- }
- public class CMvdXmlParseTool
- {
- private List<CMvdNodeInteger> m_listIntValue = null;
- private List<CMvdNodeEnumeration> m_listEnumValue = null;
- private List<CMvdNodeFloat> m_listFloatValue = null;
- private List<CMvdNodeBoolean> m_listBooleanValue = null;
- public CMvdXmlParseTool(Byte[] bufXml, uint nXmlLen)
- {
- m_listIntValue = new List<CMvdNodeInteger>();
- m_listEnumValue = new List<CMvdNodeEnumeration>();
- m_listFloatValue = new List<CMvdNodeFloat>();
- m_listBooleanValue = new List<CMvdNodeBoolean>();
- UpdateXmlBuf(bufXml, nXmlLen);
- }
- public List<CMvdNodeInteger> IntValueList
- {
- get
- {
- return m_listIntValue;
- }
- }
- public List<CMvdNodeEnumeration> EnumValueList
- {
- get
- {
- return m_listEnumValue;
- }
- }
- public List<CMvdNodeFloat> FloatValueList
- {
- get
- {
- return m_listFloatValue;
- }
- }
- public List<CMvdNodeBoolean> BooleanValueList
- {
- get
- {
- return m_listBooleanValue;
- }
- }
- public void UpdateXmlBuf(Byte[] bufXml, uint nXmlLen)
- {
- XmlDocument xmlDoc = new XmlDocument();
- XmlReaderSettings settings = new XmlReaderSettings();
- settings.IgnoreComments = true; //忽略文档里面的注释
- XmlReader reader = XmlReader.Create(new MemoryStream(bufXml, 0, (int)nXmlLen), settings);
- xmlDoc.Load(reader);
- reader.Close();
- m_listIntValue.Clear();
- m_listEnumValue.Clear();
- m_listFloatValue.Clear();
- m_listBooleanValue.Clear();
- XmlNode xnCategory = xmlDoc.SelectSingleNode("AlgorithmRoot").SelectSingleNode("Category");
- foreach (XmlNode xn in xnCategory)
- {
- switch (xn.Name)
- {
- case "Integer":
- {
- CMvdNodeInteger NodeInt = new CMvdNodeInteger();
- NodeInt.Name = ((XmlElement)xn).GetAttribute("Name");
- NodeInt.Description = xn.SelectSingleNode("Description").InnerText;
- NodeInt.DisplayName = xn.SelectSingleNode("DisplayName").InnerText;
- NodeInt.Visibility = xn.SelectSingleNode("Visibility").InnerText;
- NodeInt.AccessMode = xn.SelectSingleNode("AccessMode").InnerText;
- NodeInt.AlgorithmIndex = IntStringToInt(xn.SelectSingleNode("AlgorithmIndex").InnerText);
- NodeInt.CurValue = IntStringToInt(xn.SelectSingleNode("CurValue").InnerText);
- NodeInt.DefaultValue = IntStringToInt(xn.SelectSingleNode("DefaultValue").InnerText);
- NodeInt.MinValue = IntStringToInt(xn.SelectSingleNode("MinValue").InnerText);
- NodeInt.MaxValue = IntStringToInt(xn.SelectSingleNode("MaxValue").InnerText);
- NodeInt.IncValue = IntStringToInt(xn.SelectSingleNode("IncValue").InnerText);
- m_listIntValue.Add(NodeInt);
- }
- break;
- case "Enumeration":
- {
- CMvdNodeEnumeration NodeEnum = new CMvdNodeEnumeration();
- NodeEnum.Name = ((XmlElement)xn).GetAttribute("Name");
- NodeEnum.Description = xn.SelectSingleNode("Description").InnerText;
- NodeEnum.DisplayName = xn.SelectSingleNode("DisplayName").InnerText;
- NodeEnum.Visibility = xn.SelectSingleNode("Visibility").InnerText;
- NodeEnum.AccessMode = xn.SelectSingleNode("AccessMode").InnerText;
- NodeEnum.AlgorithmIndex = IntStringToInt(xn.SelectSingleNode("AlgorithmIndex").InnerText);
- int nCurValue = IntStringToInt(xn.SelectSingleNode("CurValue").InnerText);
- int nDefaultValue = IntStringToInt(xn.SelectSingleNode("DefaultValue").InnerText);
- XmlNodeList xnlEnumEntry = xn.SelectNodes("EnumEntry");
- List<CMvdNodeEnumEntry> clistNodeEnumEntry = new List<CMvdNodeEnumEntry>();
- foreach (XmlNode xnEnumEntry in xnlEnumEntry)
- {
- CMvdNodeEnumEntry cNodeEnumEntry = new CMvdNodeEnumEntry();
- cNodeEnumEntry.Name = ((XmlElement)xnEnumEntry).GetAttribute("Name");
- cNodeEnumEntry.Description = xnEnumEntry.SelectSingleNode("Description").InnerText;
- cNodeEnumEntry.DisplayName = xnEnumEntry.SelectSingleNode("DisplayName").InnerText;
- cNodeEnumEntry.Value = IntStringToInt(xnEnumEntry.SelectSingleNode("Value").InnerText);
- clistNodeEnumEntry.Add(cNodeEnumEntry);
- if (nCurValue == cNodeEnumEntry.Value)
- {
- NodeEnum.CurValue = cNodeEnumEntry;
- }
- if (nDefaultValue == cNodeEnumEntry.Value)
- {
- NodeEnum.DefaultValue = cNodeEnumEntry;
- }
- }
- NodeEnum.EnumRange = clistNodeEnumEntry;
- m_listEnumValue.Add(NodeEnum);
- }
- break;
- case "Float":
- {
- CMvdNodeFloat NodeFloat = new CMvdNodeFloat();
- NodeFloat.Name = ((XmlElement)xn).GetAttribute("Name");
- NodeFloat.Description = xn.SelectSingleNode("Description").InnerText;
- NodeFloat.DisplayName = xn.SelectSingleNode("DisplayName").InnerText;
- NodeFloat.Visibility = xn.SelectSingleNode("Visibility").InnerText;
- NodeFloat.AccessMode = xn.SelectSingleNode("AccessMode").InnerText;
- NodeFloat.AlgorithmIndex = IntStringToInt(xn.SelectSingleNode("AlgorithmIndex").InnerText);
- NodeFloat.CurValue = System.Convert.ToSingle(xn.SelectSingleNode("CurValue").InnerText);
- NodeFloat.DefaultValue = System.Convert.ToSingle(xn.SelectSingleNode("DefaultValue").InnerText);
- NodeFloat.MinValue = System.Convert.ToSingle(xn.SelectSingleNode("MinValue").InnerText);
- NodeFloat.MaxValue = System.Convert.ToSingle(xn.SelectSingleNode("MaxValue").InnerText);
- NodeFloat.IncValue = System.Convert.ToSingle(xn.SelectSingleNode("IncValue").InnerText);
- m_listFloatValue.Add(NodeFloat);
- }
- break;
- case "Boolean":
- {
- CMvdNodeBoolean NodeBoolean = new CMvdNodeBoolean();
- NodeBoolean.Name = ((XmlElement)xn).GetAttribute("Name");
- NodeBoolean.Description = xn.SelectSingleNode("Description").InnerText;
- NodeBoolean.DisplayName = xn.SelectSingleNode("DisplayName").InnerText;
- NodeBoolean.Visibility = xn.SelectSingleNode("Visibility").InnerText;
- NodeBoolean.AccessMode = xn.SelectSingleNode("AccessMode").InnerText;
- NodeBoolean.AlgorithmIndex = IntStringToInt(xn.SelectSingleNode("AlgorithmIndex").InnerText);
- NodeBoolean.CurValue = xn.SelectSingleNode("CurValue").InnerText.Equals("true", StringComparison.OrdinalIgnoreCase) == true ? true : false;
- NodeBoolean.DefaultValue = xn.SelectSingleNode("DefaultValue").InnerText.Equals("true", StringComparison.OrdinalIgnoreCase) == true ? true : false;
- m_listBooleanValue.Add(NodeBoolean);
- }
- break;
- default:
- {
- throw new VisionDesigner.MvdException(VisionDesigner.MVD_MODULE_TYPE.MVD_MODUL_APP
- , VisionDesigner.MVD_ERROR_CODE.MVD_E_SUPPORT
- , "Algorithm type not support!");
- }
- }
- }
- }
- public void ClearXmlBuf()
- {
- m_listIntValue.Clear();
- m_listEnumValue.Clear();
- m_listFloatValue.Clear();
- m_listBooleanValue.Clear();
- }
- private int IntStringToInt(string strIntString)
- {
- if (strIntString.Contains("0x") || strIntString.Contains("0X"))
- {
- return Convert.ToInt32(strIntString, 16);
- }
- else
- {
- return Convert.ToInt32(strIntString, 10);
- }
- }
- }
- }
|