CPUDeepObjectDetectCLass.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Drawing.Imaging;
  5. using System.IO;
  6. using System.Runtime.InteropServices;
  7. using System.Xml;
  8. using VisionDesigner;
  9. using VisionDesigner.MVDCNNDetect;
  10. namespace HikangSDK
  11. {
  12. public class CPUDeepObjectDetectCLass
  13. {
  14. private CNNDetectTool m_stCNNDetectToolObj = null;
  15. private CMvdXmlParseTool m_stXmlParseToolObj = null;
  16. private CMvdImage m_stInputImage = null;
  17. List<CMvdRectangleF> m_lBlobBoxRender1 = new List<CMvdRectangleF>();
  18. private CMvdShape m_stROIShape = null;
  19. private MVD_ALGORITHM_PLATFORM_TYPE m_enPlatformType = MVD_ALGORITHM_PLATFORM_TYPE.MVD_ALGORITHM_PLATFORM_CPU;
  20. MVD_CNN_CROP_TYPE m_enCropRoiType = MVD_CNN_CROP_TYPE.MVD_CNN_ROI_TYPE_NORMAL;
  21. MVD_CNN_PREDICT_MODE m_enPredictMode = MVD_CNN_PREDICT_MODE.MVD_CNN_PREDICT_NORMAL;
  22. public CPUDeepObjectDetectCLass()
  23. {
  24. m_stCNNDetectToolObj = new CNNDetectTool(m_enPlatformType);
  25. byte[] fileBytes = new byte[256];
  26. uint nConfigDataSize = 256;
  27. uint nConfigDataLen = 0;
  28. try
  29. {
  30. m_stCNNDetectToolObj.SaveConfiguration(fileBytes, nConfigDataSize, ref nConfigDataLen);
  31. }
  32. catch (MvdException ex)
  33. {
  34. if (MVD_ERROR_CODE.MVD_E_NOENOUGH_BUF == ex.ErrorCode)
  35. {
  36. fileBytes = new byte[nConfigDataLen];
  37. nConfigDataSize = nConfigDataLen;
  38. m_stCNNDetectToolObj.SaveConfiguration(fileBytes, nConfigDataSize, ref nConfigDataLen);
  39. }
  40. else
  41. {
  42. throw ex;
  43. }
  44. }
  45. UpdateParamList(fileBytes, nConfigDataLen);
  46. }
  47. /// <summary>
  48. /// 加载图片
  49. /// </summary>
  50. /// <param name="LoadImagePath"></param>
  51. public void LoadImage(string LoadImagePath)
  52. {
  53. try
  54. {
  55. if (!string.IsNullOrEmpty(LoadImagePath))
  56. {
  57. if (null == m_stInputImage)
  58. {
  59. m_stInputImage = new CMvdImage();
  60. }
  61. m_stInputImage.InitImage(LoadImagePath);
  62. m_stROIShape = null;
  63. m_lBlobBoxRender1.Clear();
  64. Console.WriteLine("Finish loading image from [" + LoadImagePath + "].");
  65. }
  66. }
  67. catch (MvdException ex)
  68. {
  69. Console.WriteLine("Fail to load image from [" + LoadImagePath + "]. ErrorCode: 0x" + ex.ErrorCode.ToString("X"));
  70. }
  71. catch (Exception ex)
  72. {
  73. Console.WriteLine("Fail to load image from [" + LoadImagePath + "]. Error: " + ex.Message);
  74. }
  75. }
  76. /// <summary>
  77. /// 加载图片
  78. /// </summary>
  79. /// <param name="bitmap"></param>
  80. public void LoadImage(Bitmap bitmap)
  81. {
  82. try
  83. {
  84. if (bitmap != null)
  85. {
  86. if (null == m_stInputImage)
  87. {
  88. m_stInputImage = new CMvdImage();
  89. }
  90. //m_stInputImage.InitImage(bitmap);
  91. ConvertBitmap2MVDImage(bitmap, m_stInputImage);
  92. m_stROIShape = null;
  93. m_lBlobBoxRender1.Clear();
  94. Console.WriteLine("Finish loading image from [BitMap].");
  95. }
  96. }
  97. catch (MvdException ex)
  98. {
  99. Console.WriteLine("Fail to load image from [BitMap]. ErrorCode: 0x" + ex.ErrorCode.ToString("X"));
  100. }
  101. catch (Exception ex)
  102. {
  103. Console.WriteLine("Fail to load image from [BitMap]. Error: " + ex.Message);
  104. }
  105. }
  106. /// <summary>
  107. /// 加载模型
  108. /// </summary>
  109. public void LoadDeepModel(string modelPath)
  110. {
  111. try
  112. {
  113. if (!string.IsNullOrEmpty(modelPath))
  114. {
  115. m_stCNNDetectToolObj.BasicParam.LoadModel(modelPath);
  116. Console.WriteLine("Finish loading model from [" + modelPath + "].");
  117. }
  118. }
  119. catch (MvdException ex)
  120. {
  121. Console.WriteLine("Fail to load model from [" + modelPath + "]. ErrorCode: 0x" + ex.ErrorCode.ToString("X"));
  122. }
  123. catch (System.Exception ex)
  124. {
  125. Console.WriteLine("Fail to load model from [" + modelPath + "]. Error: " + ex.Message);
  126. }
  127. }
  128. /// <summary>
  129. /// 运行检测
  130. /// </summary>
  131. public List<CNNDetectPredInfo> RunDetect()
  132. {
  133. List<CNNDetectPredInfo> Result = new List<CNNDetectPredInfo>();
  134. try
  135. {
  136. if ((null == m_stCNNDetectToolObj) || (null == m_stInputImage))
  137. {
  138. throw new MvdException(MVD_MODULE_TYPE.MVD_MODUL_APP, MVD_ERROR_CODE.MVD_E_CALLORDER);
  139. }
  140. m_stCNNDetectToolObj.InputImage = m_stInputImage;
  141. if (null == m_stROIShape)
  142. {
  143. m_stCNNDetectToolObj.ROI = new VisionDesigner.CMvdRectangleF(m_stInputImage.Width / 2, m_stInputImage.Height / 2, m_stInputImage.Width, m_stInputImage.Height);
  144. }
  145. else
  146. {
  147. m_stCNNDetectToolObj.ROI = m_stROIShape;
  148. }
  149. //设置基本参数
  150. m_stCNNDetectToolObj.BasicParam.PredictMode = m_enPredictMode;
  151. m_stCNNDetectToolObj.BasicParam.RoiCropType = m_enCropRoiType;
  152. m_stCNNDetectToolObj.BasicParam.SODParam.Col = Convert.ToUInt32(1);
  153. m_stCNNDetectToolObj.BasicParam.SODParam.Row = Convert.ToUInt32(1);
  154. m_stCNNDetectToolObj.BasicParam.SODParam.Overlap = Convert.ToSingle(0.01);
  155. m_stCNNDetectToolObj.BasicParam.BatchSize = Convert.ToInt32(4);
  156. m_stCNNDetectToolObj.BasicParam.BatchSizeEnable = false;
  157. if (m_enPlatformType != MVD_ALGORITHM_PLATFORM_TYPE.MVD_ALGORITHM_PLATFORM_GPU)
  158. {
  159. m_stCNNDetectToolObj.BasicParam.BatchSizeEnable = false;
  160. }
  161. m_stCNNDetectToolObj.SetRunParam("MaxObjNum", "100");
  162. m_stCNNDetectToolObj.Run();
  163. if (0 != m_lBlobBoxRender1.Count)
  164. {
  165. m_lBlobBoxRender1.Clear();
  166. }
  167. Console.WriteLine("Obj Num : " + m_stCNNDetectToolObj.Result.PredInfoList.Count);
  168. Result = m_stCNNDetectToolObj.Result.PredInfoList;
  169. foreach (var item in m_stCNNDetectToolObj.Result.PredInfoList)
  170. {
  171. CMvdRectangleF ObjBox = new CMvdRectangleF(item.Box.CenterX, item.Box.CenterY, item.Box.Width, item.Box.Height);
  172. ObjBox.Angle = item.Box.Angle;
  173. ObjBox.BorderColor = new MVD_COLOR(0, 255, 0, 255);
  174. m_lBlobBoxRender1.Add(ObjBox);
  175. }
  176. }
  177. catch (MvdException ex)
  178. {
  179. Console.WriteLine("Fail to execute algorithm tool. nRet = 0x" + ex.ErrorCode.ToString("X") + ". " + ex.Message.ToString());
  180. }
  181. catch (System.Exception ex)
  182. {
  183. Console.WriteLine(ex.Message + ex.Source + ex.StackTrace);
  184. }
  185. return Result;
  186. }
  187. /// <summary>
  188. /// Update paramters
  189. /// </summary>
  190. /// <param name="bufXml"></param>
  191. /// <param name="nXmlLen"></param>
  192. private void UpdateParamList(Byte[] bufXml, uint nXmlLen)
  193. {
  194. if (null == m_stXmlParseToolObj)
  195. {
  196. m_stXmlParseToolObj = new CMvdXmlParseTool(bufXml, nXmlLen);
  197. }
  198. else
  199. {
  200. m_stXmlParseToolObj.UpdateXmlBuf(bufXml, nXmlLen);
  201. }
  202. for (int i = 0; i < m_stXmlParseToolObj.IntValueList.Count; ++i)
  203. {
  204. Console.WriteLine("{0}:{1}", m_stXmlParseToolObj.IntValueList[i].Description, m_stXmlParseToolObj.IntValueList[i].CurValue);
  205. }
  206. for (int i = 0; i < m_stXmlParseToolObj.EnumValueList.Count; ++i)
  207. {
  208. Console.WriteLine("{0}:{1}", m_stXmlParseToolObj.EnumValueList[i].Description, m_stXmlParseToolObj.EnumValueList[i].CurValue.Name);
  209. }
  210. for (int i = 0; i < m_stXmlParseToolObj.FloatValueList.Count; ++i)
  211. {
  212. Console.WriteLine("{0}:{1}", m_stXmlParseToolObj.FloatValueList[i].Description, m_stXmlParseToolObj.FloatValueList[i].CurValue);
  213. }
  214. for (int i = 0; i < m_stXmlParseToolObj.BooleanValueList.Count; ++i)
  215. {
  216. Console.WriteLine("{0}:{1}", m_stXmlParseToolObj.BooleanValueList[i].Description, m_stXmlParseToolObj.BooleanValueList[i].CurValue.ToString());
  217. }
  218. }
  219. private static void ConvertBitmap2MVDImage(Bitmap cBitmapImg, CMvdImage cMvdImg)
  220. {
  221. // 参数合法性判断
  222. if (null == cBitmapImg || null == cMvdImg)
  223. {
  224. throw new MvdException(MVD_MODULE_TYPE.MVD_MODUL_APP, MVD_ERROR_CODE.MVD_E_PARAMETER_ILLEGAL);
  225. }
  226. // 判断像素格式
  227. if (PixelFormat.Format8bppIndexed != cBitmapImg.PixelFormat && PixelFormat.Format24bppRgb != cBitmapImg.PixelFormat)
  228. {
  229. throw new MvdException(MVD_MODULE_TYPE.MVD_MODUL_APP, MVD_ERROR_CODE.MVD_E_SUPPORT);
  230. }
  231. Int32 nImageWidth = cBitmapImg.Width;
  232. Int32 nImageHeight = cBitmapImg.Height;
  233. Int32 nChannelNum = 0;
  234. BitmapData bitmapData = null;
  235. try
  236. {
  237. // 获取图像信息
  238. if (PixelFormat.Format8bppIndexed == cBitmapImg.PixelFormat) // 灰度图
  239. {
  240. bitmapData = cBitmapImg.LockBits(new Rectangle(0, 0, nImageWidth, nImageHeight)
  241. , ImageLockMode.ReadOnly
  242. , PixelFormat.Format8bppIndexed);
  243. cMvdImg.InitImage(Convert.ToUInt32(nImageWidth), Convert.ToUInt32(nImageHeight), MVD_PIXEL_FORMAT.MVD_PIXEL_MONO_08);
  244. nChannelNum = 1;
  245. }
  246. else if (PixelFormat.Format24bppRgb == cBitmapImg.PixelFormat) // 彩色图
  247. {
  248. bitmapData = cBitmapImg.LockBits(new Rectangle(0, 0, nImageWidth, nImageHeight)
  249. , ImageLockMode.ReadOnly
  250. , PixelFormat.Format24bppRgb);
  251. cMvdImg.InitImage(Convert.ToUInt32(nImageWidth), Convert.ToUInt32(nImageHeight), MVD_PIXEL_FORMAT.MVD_PIXEL_RGB_RGB24_C3);
  252. nChannelNum = 3;
  253. }
  254. // 考虑图像是否4字节对齐,bitmap要求4字节对齐,而mvdimage不要求对齐
  255. if (0 == nImageWidth % 4) // 4字节对齐时,直接拷贝
  256. {
  257. Marshal.Copy(bitmapData.Scan0, cMvdImg.GetImageData().stDataChannel[0].arrDataBytes, 0, nImageWidth * nImageHeight * nChannelNum);
  258. }
  259. else // 按步长逐行拷贝
  260. {
  261. // 每行实际占用字节数
  262. Int32 nRowPixelByteNum = nImageWidth * nChannelNum + 4 - (nImageWidth * nChannelNum % 4);
  263. // 每行首字节首地址
  264. IntPtr bitmapDataRowPos = IntPtr.Zero;
  265. for (int i = 0; i < nImageHeight; i++)
  266. {
  267. // 获取每行第一个像素值的首地址
  268. bitmapDataRowPos = new IntPtr(bitmapData.Scan0.ToInt64() + nRowPixelByteNum * i);
  269. Marshal.Copy(bitmapDataRowPos, cMvdImg.GetImageData().stDataChannel[0].arrDataBytes, i * nImageWidth * nChannelNum, nImageWidth * nChannelNum);
  270. }
  271. }
  272. // bitmap彩色图按BGR存储,而MVDimg按RGB存储,改变存储顺序
  273. // 交换R和B
  274. if (PixelFormat.Format24bppRgb == cBitmapImg.PixelFormat)
  275. {
  276. byte bTemp;
  277. byte[] bMvdImgData = cMvdImg.GetImageData().stDataChannel[0].arrDataBytes;
  278. for (int i = 0; i < nImageWidth * nImageHeight; i++)
  279. {
  280. bTemp = bMvdImgData[3 * i];
  281. bMvdImgData[3 * i] = bMvdImgData[3 * i + 2];
  282. bMvdImgData[3 * i + 2] = bTemp;
  283. }
  284. }
  285. }
  286. finally
  287. {
  288. cBitmapImg.UnlockBits(bitmapData);
  289. }
  290. }
  291. private static void ConvertMVDImage2Bitmap(CMvdImage cMvdImg, ref Bitmap cBitmapImg)
  292. {
  293. // 参数合法性判断
  294. if (null == cMvdImg)
  295. {
  296. throw new MvdException(MVD_MODULE_TYPE.MVD_MODUL_APP, MVD_ERROR_CODE.MVD_E_PARAMETER_ILLEGAL);
  297. }
  298. // 判断像素格式
  299. if (MVD_PIXEL_FORMAT.MVD_PIXEL_MONO_08 != cMvdImg.PixelFormat && MVD_PIXEL_FORMAT.MVD_PIXEL_RGB_RGB24_C3 != cMvdImg.PixelFormat)
  300. {
  301. throw new MvdException(MVD_MODULE_TYPE.MVD_MODUL_APP, MVD_ERROR_CODE.MVD_E_SUPPORT);
  302. }
  303. Int32 nImageWidth = Convert.ToInt32(cMvdImg.Width);
  304. Int32 nImageHeight = Convert.ToInt32(cMvdImg.Height);
  305. Int32 nChannelNum = 0;
  306. BitmapData bitmapData = null;
  307. byte[] bBitmapDataTemp = null;
  308. try
  309. {
  310. // 获取图像信息
  311. if (MVD_PIXEL_FORMAT.MVD_PIXEL_MONO_08 == cMvdImg.PixelFormat) // 灰度图
  312. {
  313. cBitmapImg = new Bitmap(nImageWidth, nImageHeight, PixelFormat.Format8bppIndexed);
  314. // 灰度图需指定调色板
  315. ColorPalette colorPalette = cBitmapImg.Palette;
  316. for (int j = 0; j < 256; j++)
  317. {
  318. colorPalette.Entries[j] = Color.FromArgb(j, j, j);
  319. }
  320. cBitmapImg.Palette = colorPalette;
  321. bitmapData = cBitmapImg.LockBits(new Rectangle(0, 0, nImageWidth, nImageHeight)
  322. , ImageLockMode.WriteOnly
  323. , PixelFormat.Format8bppIndexed);
  324. // 灰度图不做深拷贝
  325. bBitmapDataTemp = cMvdImg.GetImageData().stDataChannel[0].arrDataBytes;
  326. nChannelNum = 1;
  327. }
  328. else if (MVD_PIXEL_FORMAT.MVD_PIXEL_RGB_RGB24_C3 == cMvdImg.PixelFormat) // 彩色图
  329. {
  330. cBitmapImg = new Bitmap(nImageWidth, nImageHeight, PixelFormat.Format24bppRgb);
  331. bitmapData = cBitmapImg.LockBits(new Rectangle(0, 0, nImageWidth, nImageHeight)
  332. , ImageLockMode.WriteOnly
  333. , PixelFormat.Format24bppRgb);
  334. // 彩色图做深拷贝
  335. bBitmapDataTemp = new byte[cMvdImg.GetImageData().stDataChannel[0].nLen];
  336. Array.Copy(cMvdImg.GetImageData().stDataChannel[0].arrDataBytes, bBitmapDataTemp, bBitmapDataTemp.Length);
  337. nChannelNum = 3;
  338. }
  339. // bitmap彩色图按BGR存储,而MVDimg按RGB存储,改变存储顺序
  340. // 交换R和B
  341. if (MVD_PIXEL_FORMAT.MVD_PIXEL_RGB_RGB24_C3 == cMvdImg.PixelFormat)
  342. {
  343. byte bTemp;
  344. for (int i = 0; i < nImageWidth * nImageHeight; i++)
  345. {
  346. bTemp = bBitmapDataTemp[3 * i];
  347. bBitmapDataTemp[3 * i] = bBitmapDataTemp[3 * i + 2];
  348. bBitmapDataTemp[3 * i + 2] = bTemp;
  349. }
  350. }
  351. // 考虑图像是否4字节对齐,bitmap要求4字节对齐,而mvdimage不要求对齐
  352. if (0 == nImageWidth % 4) // 4字节对齐时,直接拷贝
  353. {
  354. Marshal.Copy(bBitmapDataTemp, 0, bitmapData.Scan0, nImageWidth * nImageHeight * nChannelNum);
  355. }
  356. else // 按步长逐行拷贝
  357. {
  358. // 每行实际占用字节数
  359. Int32 nRowPixelByteNum = nImageWidth * nChannelNum + 4 - (nImageWidth * nChannelNum % 4);
  360. // 每行首字节首地址
  361. IntPtr bitmapDataRowPos = IntPtr.Zero;
  362. for (int i = 0; i < nImageHeight; i++)
  363. {
  364. // 获取每行第一个像素值的首地址
  365. bitmapDataRowPos = new IntPtr(bitmapData.Scan0.ToInt64() + nRowPixelByteNum * i);
  366. Marshal.Copy(bBitmapDataTemp, i * nImageWidth * nChannelNum, bitmapDataRowPos, nImageWidth * nChannelNum);
  367. }
  368. }
  369. cBitmapImg.UnlockBits(bitmapData);
  370. }
  371. catch (MvdException ex)
  372. {
  373. if (null != cBitmapImg)
  374. {
  375. cBitmapImg.UnlockBits(bitmapData);
  376. cBitmapImg.Dispose();
  377. cBitmapImg = null;
  378. }
  379. throw ex;
  380. }
  381. catch (System.Exception ex)
  382. {
  383. if (null != cBitmapImg)
  384. {
  385. cBitmapImg.UnlockBits(bitmapData);
  386. cBitmapImg.Dispose();
  387. cBitmapImg = null;
  388. }
  389. throw ex;
  390. }
  391. }
  392. }
  393. public class CMvdXmlParseTool
  394. {
  395. private List<CMvdNodeInteger> m_listIntValue = null;
  396. private List<CMvdNodeEnumeration> m_listEnumValue = null;
  397. private List<CMvdNodeFloat> m_listFloatValue = null;
  398. private List<CMvdNodeBoolean> m_listBooleanValue = null;
  399. public CMvdXmlParseTool(Byte[] bufXml, uint nXmlLen)
  400. {
  401. m_listIntValue = new List<CMvdNodeInteger>();
  402. m_listEnumValue = new List<CMvdNodeEnumeration>();
  403. m_listFloatValue = new List<CMvdNodeFloat>();
  404. m_listBooleanValue = new List<CMvdNodeBoolean>();
  405. UpdateXmlBuf(bufXml, nXmlLen);
  406. }
  407. public List<CMvdNodeInteger> IntValueList
  408. {
  409. get
  410. {
  411. return m_listIntValue;
  412. }
  413. }
  414. public List<CMvdNodeEnumeration> EnumValueList
  415. {
  416. get
  417. {
  418. return m_listEnumValue;
  419. }
  420. }
  421. public List<CMvdNodeFloat> FloatValueList
  422. {
  423. get
  424. {
  425. return m_listFloatValue;
  426. }
  427. }
  428. public List<CMvdNodeBoolean> BooleanValueList
  429. {
  430. get
  431. {
  432. return m_listBooleanValue;
  433. }
  434. }
  435. public void UpdateXmlBuf(Byte[] bufXml, uint nXmlLen)
  436. {
  437. XmlDocument xmlDoc = new XmlDocument();
  438. XmlReaderSettings settings = new XmlReaderSettings();
  439. settings.IgnoreComments = true; //忽略文档里面的注释
  440. XmlReader reader = XmlReader.Create(new MemoryStream(bufXml, 0, (int)nXmlLen), settings);
  441. xmlDoc.Load(reader);
  442. reader.Close();
  443. m_listIntValue.Clear();
  444. m_listEnumValue.Clear();
  445. m_listFloatValue.Clear();
  446. m_listBooleanValue.Clear();
  447. XmlNode xnCategory = xmlDoc.SelectSingleNode("AlgorithmRoot").SelectSingleNode("Category");
  448. foreach (XmlNode xn in xnCategory)
  449. {
  450. switch (xn.Name)
  451. {
  452. case "Integer":
  453. {
  454. CMvdNodeInteger NodeInt = new CMvdNodeInteger();
  455. NodeInt.Name = ((XmlElement)xn).GetAttribute("Name");
  456. NodeInt.Description = xn.SelectSingleNode("Description").InnerText;
  457. NodeInt.DisplayName = xn.SelectSingleNode("DisplayName").InnerText;
  458. NodeInt.Visibility = xn.SelectSingleNode("Visibility").InnerText;
  459. NodeInt.AccessMode = xn.SelectSingleNode("AccessMode").InnerText;
  460. NodeInt.AlgorithmIndex = IntStringToInt(xn.SelectSingleNode("AlgorithmIndex").InnerText);
  461. NodeInt.CurValue = IntStringToInt(xn.SelectSingleNode("CurValue").InnerText);
  462. NodeInt.DefaultValue = IntStringToInt(xn.SelectSingleNode("DefaultValue").InnerText);
  463. NodeInt.MinValue = IntStringToInt(xn.SelectSingleNode("MinValue").InnerText);
  464. NodeInt.MaxValue = IntStringToInt(xn.SelectSingleNode("MaxValue").InnerText);
  465. NodeInt.IncValue = IntStringToInt(xn.SelectSingleNode("IncValue").InnerText);
  466. m_listIntValue.Add(NodeInt);
  467. }
  468. break;
  469. case "Enumeration":
  470. {
  471. CMvdNodeEnumeration NodeEnum = new CMvdNodeEnumeration();
  472. NodeEnum.Name = ((XmlElement)xn).GetAttribute("Name");
  473. NodeEnum.Description = xn.SelectSingleNode("Description").InnerText;
  474. NodeEnum.DisplayName = xn.SelectSingleNode("DisplayName").InnerText;
  475. NodeEnum.Visibility = xn.SelectSingleNode("Visibility").InnerText;
  476. NodeEnum.AccessMode = xn.SelectSingleNode("AccessMode").InnerText;
  477. NodeEnum.AlgorithmIndex = IntStringToInt(xn.SelectSingleNode("AlgorithmIndex").InnerText);
  478. int nCurValue = IntStringToInt(xn.SelectSingleNode("CurValue").InnerText);
  479. int nDefaultValue = IntStringToInt(xn.SelectSingleNode("DefaultValue").InnerText);
  480. XmlNodeList xnlEnumEntry = xn.SelectNodes("EnumEntry");
  481. List<CMvdNodeEnumEntry> clistNodeEnumEntry = new List<CMvdNodeEnumEntry>();
  482. foreach (XmlNode xnEnumEntry in xnlEnumEntry)
  483. {
  484. CMvdNodeEnumEntry cNodeEnumEntry = new CMvdNodeEnumEntry();
  485. cNodeEnumEntry.Name = ((XmlElement)xnEnumEntry).GetAttribute("Name");
  486. cNodeEnumEntry.Description = xnEnumEntry.SelectSingleNode("Description").InnerText;
  487. cNodeEnumEntry.DisplayName = xnEnumEntry.SelectSingleNode("DisplayName").InnerText;
  488. cNodeEnumEntry.Value = IntStringToInt(xnEnumEntry.SelectSingleNode("Value").InnerText);
  489. clistNodeEnumEntry.Add(cNodeEnumEntry);
  490. if (nCurValue == cNodeEnumEntry.Value)
  491. {
  492. NodeEnum.CurValue = cNodeEnumEntry;
  493. }
  494. if (nDefaultValue == cNodeEnumEntry.Value)
  495. {
  496. NodeEnum.DefaultValue = cNodeEnumEntry;
  497. }
  498. }
  499. NodeEnum.EnumRange = clistNodeEnumEntry;
  500. m_listEnumValue.Add(NodeEnum);
  501. }
  502. break;
  503. case "Float":
  504. {
  505. CMvdNodeFloat NodeFloat = new CMvdNodeFloat();
  506. NodeFloat.Name = ((XmlElement)xn).GetAttribute("Name");
  507. NodeFloat.Description = xn.SelectSingleNode("Description").InnerText;
  508. NodeFloat.DisplayName = xn.SelectSingleNode("DisplayName").InnerText;
  509. NodeFloat.Visibility = xn.SelectSingleNode("Visibility").InnerText;
  510. NodeFloat.AccessMode = xn.SelectSingleNode("AccessMode").InnerText;
  511. NodeFloat.AlgorithmIndex = IntStringToInt(xn.SelectSingleNode("AlgorithmIndex").InnerText);
  512. NodeFloat.CurValue = System.Convert.ToSingle(xn.SelectSingleNode("CurValue").InnerText);
  513. NodeFloat.DefaultValue = System.Convert.ToSingle(xn.SelectSingleNode("DefaultValue").InnerText);
  514. NodeFloat.MinValue = System.Convert.ToSingle(xn.SelectSingleNode("MinValue").InnerText);
  515. NodeFloat.MaxValue = System.Convert.ToSingle(xn.SelectSingleNode("MaxValue").InnerText);
  516. NodeFloat.IncValue = System.Convert.ToSingle(xn.SelectSingleNode("IncValue").InnerText);
  517. m_listFloatValue.Add(NodeFloat);
  518. }
  519. break;
  520. case "Boolean":
  521. {
  522. CMvdNodeBoolean NodeBoolean = new CMvdNodeBoolean();
  523. NodeBoolean.Name = ((XmlElement)xn).GetAttribute("Name");
  524. NodeBoolean.Description = xn.SelectSingleNode("Description").InnerText;
  525. NodeBoolean.DisplayName = xn.SelectSingleNode("DisplayName").InnerText;
  526. NodeBoolean.Visibility = xn.SelectSingleNode("Visibility").InnerText;
  527. NodeBoolean.AccessMode = xn.SelectSingleNode("AccessMode").InnerText;
  528. NodeBoolean.AlgorithmIndex = IntStringToInt(xn.SelectSingleNode("AlgorithmIndex").InnerText);
  529. NodeBoolean.CurValue = xn.SelectSingleNode("CurValue").InnerText.Equals("true", StringComparison.OrdinalIgnoreCase) == true ? true : false;
  530. NodeBoolean.DefaultValue = xn.SelectSingleNode("DefaultValue").InnerText.Equals("true", StringComparison.OrdinalIgnoreCase) == true ? true : false;
  531. m_listBooleanValue.Add(NodeBoolean);
  532. }
  533. break;
  534. default:
  535. {
  536. throw new VisionDesigner.MvdException(VisionDesigner.MVD_MODULE_TYPE.MVD_MODUL_APP
  537. , VisionDesigner.MVD_ERROR_CODE.MVD_E_SUPPORT
  538. , "Algorithm type not support!");
  539. }
  540. }
  541. }
  542. }
  543. public void ClearXmlBuf()
  544. {
  545. m_listIntValue.Clear();
  546. m_listEnumValue.Clear();
  547. m_listFloatValue.Clear();
  548. m_listBooleanValue.Clear();
  549. }
  550. private int IntStringToInt(string strIntString)
  551. {
  552. if (strIntString.Contains("0x") || strIntString.Contains("0X"))
  553. {
  554. return Convert.ToInt32(strIntString, 16);
  555. }
  556. else
  557. {
  558. return Convert.ToInt32(strIntString, 10);
  559. }
  560. }
  561. }
  562. public class CMvdNodeBase
  563. {
  564. string m_strName = string.Empty;
  565. string m_strDescription = string.Empty;
  566. string m_strDisplayName = string.Empty;
  567. string m_strVisibility = string.Empty;
  568. string m_strAccessMode = string.Empty;
  569. int m_nAlgorithmIndex = 0;
  570. public string Name
  571. {
  572. get
  573. {
  574. return m_strName;
  575. }
  576. set
  577. {
  578. m_strName = value;
  579. }
  580. }
  581. public string Description
  582. {
  583. get
  584. {
  585. return m_strDescription;
  586. }
  587. set
  588. {
  589. m_strDescription = value;
  590. }
  591. }
  592. public string DisplayName
  593. {
  594. get
  595. {
  596. return m_strDisplayName;
  597. }
  598. set
  599. {
  600. m_strDisplayName = value;
  601. }
  602. }
  603. public string Visibility
  604. {
  605. get
  606. {
  607. return m_strVisibility;
  608. }
  609. set
  610. {
  611. m_strVisibility = value;
  612. }
  613. }
  614. public string AccessMode
  615. {
  616. get
  617. {
  618. return m_strAccessMode;
  619. }
  620. set
  621. {
  622. m_strAccessMode = value;
  623. }
  624. }
  625. public int AlgorithmIndex
  626. {
  627. get
  628. {
  629. return m_nAlgorithmIndex;
  630. }
  631. set
  632. {
  633. m_nAlgorithmIndex = value;
  634. }
  635. }
  636. }
  637. public class CMvdNodeInteger : CMvdNodeBase
  638. {
  639. int m_nCurValue = 0;
  640. int m_nDefaultValue = 0;
  641. int m_nMinValue = 0;
  642. int m_nMaxValue = 0;
  643. int m_nIncValue = 0;
  644. public int CurValue
  645. {
  646. get
  647. {
  648. return m_nCurValue;
  649. }
  650. set
  651. {
  652. m_nCurValue = value;
  653. }
  654. }
  655. public int DefaultValue
  656. {
  657. get
  658. {
  659. return m_nDefaultValue;
  660. }
  661. set
  662. {
  663. m_nDefaultValue = value;
  664. }
  665. }
  666. public int MinValue
  667. {
  668. get
  669. {
  670. return m_nMinValue;
  671. }
  672. set
  673. {
  674. m_nMinValue = value;
  675. }
  676. }
  677. public int MaxValue
  678. {
  679. get
  680. {
  681. return m_nMaxValue;
  682. }
  683. set
  684. {
  685. m_nMaxValue = value;
  686. }
  687. }
  688. public int IncValue
  689. {
  690. get
  691. {
  692. return m_nIncValue;
  693. }
  694. set
  695. {
  696. m_nIncValue = value;
  697. }
  698. }
  699. }
  700. public class CMvdNodeEnumEntry
  701. {
  702. string m_strName = string.Empty;
  703. string m_strDescription = string.Empty;
  704. string m_strDisplayName = string.Empty;
  705. bool m_bIsImplemented = false;
  706. int m_nValue = 0;
  707. public string Name
  708. {
  709. get
  710. {
  711. return m_strName;
  712. }
  713. set
  714. {
  715. m_strName = value;
  716. }
  717. }
  718. public string Description
  719. {
  720. get
  721. {
  722. return m_strDescription;
  723. }
  724. set
  725. {
  726. m_strDescription = value;
  727. }
  728. }
  729. public string DisplayName
  730. {
  731. get
  732. {
  733. return m_strDisplayName;
  734. }
  735. set
  736. {
  737. m_strDisplayName = value;
  738. }
  739. }
  740. public bool IsImplemented
  741. {
  742. get
  743. {
  744. return m_bIsImplemented;
  745. }
  746. set
  747. {
  748. m_bIsImplemented = value;
  749. }
  750. }
  751. public int Value
  752. {
  753. get
  754. {
  755. return m_nValue;
  756. }
  757. set
  758. {
  759. m_nValue = value;
  760. }
  761. }
  762. }
  763. public class CMvdNodeFloat : CMvdNodeBase
  764. {
  765. float m_fCurValue = 0;
  766. float m_fDefaultValue = 0;
  767. float m_fMinValue = 0;
  768. float m_fMaxValue = 0;
  769. float m_fIncValue = 0;
  770. public float CurValue
  771. {
  772. get
  773. {
  774. return m_fCurValue;
  775. }
  776. set
  777. {
  778. m_fCurValue = value;
  779. }
  780. }
  781. public float DefaultValue
  782. {
  783. get
  784. {
  785. return m_fDefaultValue;
  786. }
  787. set
  788. {
  789. m_fDefaultValue = value;
  790. }
  791. }
  792. public float MinValue
  793. {
  794. get
  795. {
  796. return m_fMinValue;
  797. }
  798. set
  799. {
  800. m_fMinValue = value;
  801. }
  802. }
  803. public float MaxValue
  804. {
  805. get
  806. {
  807. return m_fMaxValue;
  808. }
  809. set
  810. {
  811. m_fMaxValue = value;
  812. }
  813. }
  814. public float IncValue
  815. {
  816. get
  817. {
  818. return m_fIncValue;
  819. }
  820. set
  821. {
  822. m_fIncValue = value;
  823. }
  824. }
  825. }
  826. public class CMvdNodeBoolean : CMvdNodeBase
  827. {
  828. bool m_bDefaultValue = false;
  829. bool m_bCurValue = false;
  830. public bool CurValue
  831. {
  832. get
  833. {
  834. return m_bCurValue;
  835. }
  836. set
  837. {
  838. m_bCurValue = value;
  839. }
  840. }
  841. public bool DefaultValue
  842. {
  843. get
  844. {
  845. return m_bDefaultValue;
  846. }
  847. set
  848. {
  849. m_bDefaultValue = value;
  850. }
  851. }
  852. }
  853. public class CMvdNodeEnumeration : CMvdNodeBase
  854. {
  855. CMvdNodeEnumEntry m_eCurValue = new CMvdNodeEnumEntry();
  856. CMvdNodeEnumEntry m_eDefaultValue = new CMvdNodeEnumEntry();
  857. List<CMvdNodeEnumEntry> m_listEnumEntry = new List<CMvdNodeEnumEntry>();
  858. public CMvdNodeEnumEntry CurValue
  859. {
  860. get
  861. {
  862. return m_eCurValue;
  863. }
  864. set
  865. {
  866. m_eCurValue = value;
  867. }
  868. }
  869. public CMvdNodeEnumEntry DefaultValue
  870. {
  871. get
  872. {
  873. return m_eDefaultValue;
  874. }
  875. set
  876. {
  877. m_eDefaultValue = value;
  878. }
  879. }
  880. public List<CMvdNodeEnumEntry> EnumRange
  881. {
  882. get
  883. {
  884. return m_listEnumEntry;
  885. }
  886. set
  887. {
  888. m_listEnumEntry = value;
  889. }
  890. }
  891. }
  892. }