ColorData2Graber.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570
  1. using System;
  2. using System.Linq;
  3. using System.Drawing;
  4. using System.Threading;
  5. using System.Diagnostics;
  6. using SHJX.Service.Common.Utils;
  7. using System.Collections.Generic;
  8. using SHJX.Service.Common.Logging;
  9. using Microsoft.Extensions.Logging;
  10. using AForge.Video.DirectShow;
  11. using SHJX.Service.Model.CRUDModules;
  12. namespace shjxCamera
  13. {
  14. /// <summary>
  15. /// 图像采集器,定时进行图像采集
  16. /// 每次采样发布采样事件:ColorDataGrabed
  17. /// </summary>
  18. public class ColorData2Graber
  19. {
  20. private static readonly ILogger logger = LogFactory.BuildLogger(typeof(ColorData2Graber));
  21. #region fields
  22. /// <summary>
  23. /// 采集到的色彩数据队列
  24. /// </summary>
  25. private List<ColorData2Point> LstColorDataPoints;
  26. #endregion
  27. #region properties
  28. /// <summary>
  29. /// 摄像头
  30. /// </summary>
  31. public WebCamera2 WebCam { get; set; }
  32. /// <summary>
  33. /// 提取ROI区域色彩数据
  34. /// </summary>
  35. protected ImageRGBanalysis2 ColorAnalysis { get; set; }
  36. /// <summary>
  37. /// 停止数据采集
  38. /// </summary>
  39. protected bool IsStopGrab { get; set; }
  40. /// <summary>
  41. /// 每帧间隔采集时间,毫秒
  42. /// </summary>
  43. public int Interval { get; set; }
  44. /// <summary>
  45. /// 图像目标区域
  46. /// </summary>
  47. public Rectangle RectROI { get; set; }
  48. public int CurrExposure { get; set; }
  49. /// <summary>
  50. /// 当前状态:true=工作中,正在采集数据;false=空闲中,未采集数据;
  51. /// </summary>
  52. public bool IsWorking { get; set; }
  53. private Camera2Value cameraValueAll = new Camera2Value();
  54. #endregion
  55. #region methods
  56. /// <summary>
  57. /// 构造色点采集器对象
  58. /// </summary>
  59. /// <param name="webcam"></param>
  60. public ColorData2Graber(WebCamera2 webcam)
  61. {
  62. WebCam = webcam ?? new WebCamera2();
  63. ColorAnalysis = new ImageRGBanalysis2();
  64. RectROI = new Rectangle(0, 0, 10, 10);
  65. LstColorDataPoints = new List<ColorData2Point>();
  66. Interval = 50;
  67. IsStopGrab = false;
  68. IsWorking = false;
  69. }
  70. /// <summary>
  71. /// 自动调整目标取图区域的位置
  72. /// </summary>
  73. public Rectangle UpdateRoiPos(bool writeFlag)
  74. {
  75. try
  76. {
  77. Bitmap imgBitmap = WebCam.GrabImage2();
  78. if (imgBitmap == null)
  79. {
  80. int cnt = 30;
  81. while (imgBitmap == null && cnt-- > 0)
  82. {
  83. logger.LogError(string.Format("摄像头2imgBitmap2 == null && cnt-- > 0"));
  84. Thread.Sleep(100);
  85. imgBitmap = WebCam.GrabImage2();
  86. }
  87. if (imgBitmap == null)
  88. {
  89. logger.LogError(string.Format("摄像头2imgBitmap2 == null"));
  90. return Titration2Settings.SensorPara.RoiSample;
  91. }
  92. }
  93. //Random rd = new Random();
  94. //string name = System.DateTime.Now.ToString("yyyyMMddHHmmss") + rd.ToString() + ".bmp";
  95. //imgBitmap.Save("C:\\Users\\25109\\Desktop\\软件版本库\\测试文件\\高锰测试\\摄像2图片\\"+ name);
  96. logger.LogCritical(string.Format("22222222old roi=({0}, {1}, {2}, {3})", RectROI.X, RectROI.Y, RectROI.Right, RectROI.Bottom));
  97. RectROI = ColorAnalysis.GetRoiPos(imgBitmap, Titration2Settings.SensorPara.RoiSample, 35); // 定位新的目标区域坐标
  98. RectROI.Offset(Titration2Settings.SensorPara.RoiOffsetX, 0); // 加入偏移量
  99. if (Titration2Settings.SensorPara.UseRoiMask)
  100. {
  101. // 计算目标区域的均值,以均值的1/2作为阈值查找RoiMask
  102. int sumR = 0, sumG = 0, sumB = 0;
  103. ColorAnalysis.GetTotalFromImage(imgBitmap, RectROI, ref sumR, ref sumG, ref sumB);
  104. sumB = Math.Min(10, sumB / (RectROI.Width * RectROI.Height) / 2);
  105. #region 检查信号值是否异常[=0]
  106. if (sumB < 0.5)
  107. {
  108. throw new Exception("信号值异常[0],滴定须终止。");
  109. }
  110. #endregion
  111. Titration2Settings.SensorPara.RoiMaskPoints = ColorAnalysis.GetRoiMask(imgBitmap, RectROI, sumB);
  112. }
  113. logger.LogCritical(string.Format("22222222new roi=({0}, {1}, {2}, {3}), offset=({4},0)", RectROI.X, RectROI.Y, RectROI.Right, RectROI.Bottom, Titration2Settings.SensorPara.RoiOffsetX));
  114. if (writeFlag)
  115. {
  116. ColorAnalysis.WriteRGBlog(imgBitmap, RectROI, "定位后数据" + RectROI.ToString());
  117. }
  118. }
  119. catch (Exception ex)
  120. {
  121. logger.LogError(ex.ToString());
  122. }
  123. return RectROI;
  124. }
  125. /// <summary>
  126. /// 自动调节曝光值
  127. /// </summary>
  128. public void PresetLightParam(int maxRange)
  129. {
  130. logger.LogCritical("22222222自动调节曝光值");
  131. WebCam.SetProperties(CameraControlProperty.Exposure, maxRange,CameraControlFlags.Manual);
  132. WebCam.GetPropertiesRange(CameraControlProperty.Exposure, out var min, out var max, out var size, out var value, out var flag);
  133. Thread.Sleep(1000); //min=-9,max=0;size=1;value=-7;flag=Manual;
  134. // 读取信号值
  135. var cdp = GrabSignal(500);
  136. // 判断信号所在区间,小于额定值范围则缩小曝光值,大于额定范围则增大曝光值
  137. CameraControlFlags flags = CameraControlFlags.Manual;
  138. WebCam.GetProperties(CameraControlProperty.Exposure, out int val, out flags);
  139. int maxcount = 10;
  140. double bsvBelow = 114;
  141. double bsvUp = 114;
  142. int valBelow = -9;
  143. int valUp = 0;
  144. double bsv = 0.0;
  145. bool flagJudge = true; ;
  146. while (maxcount > 0)
  147. {
  148. maxcount--;
  149. bsv = cdp.GetBSV();
  150. if (bsv < 110)
  151. {
  152. bsvBelow = bsv;
  153. if (val.Equals(min))
  154. break;
  155. val = Math.Min(max, Math.Max(maxRange, val - 1));
  156. valBelow = val;
  157. logger.LogCritical($"22222222增大曝光值为:{val}");
  158. }
  159. else if (bsv > 118)
  160. {
  161. bsvUp = bsv;
  162. if (val.Equals(max))
  163. break;
  164. val = Math.Min(max, Math.Max(maxRange, val + 1));
  165. valUp = val;
  166. logger.LogCritical($"22222222减少曝光值为:{val}");
  167. }
  168. else
  169. {
  170. flagJudge = false; ;
  171. break;
  172. }
  173. WebCam.SetProperties(CameraControlProperty.Exposure, val, CameraControlFlags.Manual);
  174. Thread.Sleep(500);
  175. UpdateRoiPos(false);
  176. cdp = GrabSignal(500);
  177. }
  178. if (flagJudge)
  179. {
  180. val = 114 - bsvBelow > bsvUp - 114 ? valBelow : valUp;
  181. val = Math.Min(max, Math.Max(maxRange, val));
  182. WebCam.SetProperties(CameraControlProperty.Exposure, val, CameraControlFlags.Manual);
  183. Thread.Sleep(500);
  184. ContinuePresetLightParam();
  185. }
  186. WebCam.GetProperties(CameraControlProperty.Exposure, out val, out flags);
  187. CurrExposure = val;
  188. logger.LogCritical($"22222222新的曝光值为:{val}");
  189. }
  190. public void ContinuePresetLightParam()
  191. {
  192. logger.LogCritical("22222222自动调节亮度值Brightness");
  193. WebCam.GetVideoProcAmpPropertiesRange(VideoProcAmpProperty.Brightness, out var minb, out var maxb, out var sizeb, out var valueb, out var flagb);
  194. Thread.Sleep(1000);
  195. // 读取信号值
  196. var cdp = GrabSignal(500);
  197. VideoProcAmpFlags flags = VideoProcAmpFlags.Manual;
  198. WebCam.GetVideoProcAmpProperties(VideoProcAmpProperty.Brightness, out int val, out flags);
  199. int maxcount = 40;
  200. while (maxcount > 0)
  201. {
  202. maxcount--;
  203. if (cdp.GetBSV() < 110)
  204. {
  205. if (val < minb) break;
  206. val = val + 1;
  207. logger.LogCritical($"22222222增大亮度值为:{val}");
  208. }
  209. else if (cdp.GetBSV() > 118)
  210. {
  211. if (val > maxb) break;
  212. val = val - 1;
  213. logger.LogCritical($"22222222减少亮度值为:{val}");
  214. }
  215. else
  216. {
  217. break;
  218. }
  219. WebCam.SetVideoProcAmpProperties(VideoProcAmpProperty.Brightness, val, VideoProcAmpFlags.Manual);
  220. Thread.Sleep(500);
  221. UpdateRoiPos(false);
  222. cdp = GrabSignal(500);
  223. }
  224. if (cdp.GetBSV() > 118)
  225. {logger.LogCritical($"22222222新的亮度值为:{val}");
  226. PresetLightParammanual(cameraValueAll, 10);
  227. }
  228. WebCam.GetVideoProcAmpProperties(AForge.Video.DirectShow.VideoProcAmpProperty.Brightness, out val, out flagb);
  229. CurrExposure = val;
  230. logger.LogCritical($"22222222新的亮度值为:{val}");
  231. }
  232. public void PresetLightParammanual(Camera2Value cameraValue, int explosionRange)
  233. {
  234. cameraValueAll = cameraValue;
  235. //WebCam.GetVideoProcAmpPropertiesRange(AForge.Video.DirectShow.VideoProcAmpProperty.Brightness, out var minb, out var maxb, out var sizeb, out var valueb, out var flagb);
  236. //WebCam.GetVideoProcAmpPropertiesRange(AForge.Video.DirectShow.VideoProcAmpProperty.Contrast, out var minbc, out var maxbc, out var sizebc, out var valuebc, out var flagbc);
  237. //WebCam.GetVideoProcAmpPropertiesRange(AForge.Video.DirectShow.VideoProcAmpProperty.Hue, out var minbh, out var maxbh, out var sizebh, out var valuebh, out var flagbh);
  238. //WebCam.GetVideoProcAmpPropertiesRange(AForge.Video.DirectShow.VideoProcAmpProperty.Saturation, out var minbs, out var maxbs, out var sizebs, out var valuebs, out var flagbs);
  239. //WebCam.GetVideoProcAmpPropertiesRange(AForge.Video.DirectShow.VideoProcAmpProperty.Sharpness, out var mins, out var maxs, out var sizes, out var values, out var flags);
  240. //WebCam.GetVideoProcAmpPropertiesRange(AForge.Video.DirectShow.VideoProcAmpProperty.WhiteBalance, out var minbw, out var maxbw, out var sizebw, out var valuebw, out var flagbw);
  241. //WebCam.GetVideoProcAmpPropertiesRange(AForge.Video.DirectShow.VideoProcAmpProperty.Gain, out var minbg, out var maxbg, out var sizebg, out var valuebg, out var flagbg);
  242. WebCam.SetVideoProcAmpProperties(VideoProcAmpProperty.Brightness, cameraValue.Brightness, VideoProcAmpFlags.Manual);
  243. WebCam.SetVideoProcAmpProperties(VideoProcAmpProperty.Contrast, cameraValue.Contrast, VideoProcAmpFlags.Manual);
  244. WebCam.SetVideoProcAmpProperties(VideoProcAmpProperty.Sharpness, cameraValue.Sharpness, VideoProcAmpFlags.Manual);
  245. WebCam.SetVideoProcAmpProperties(VideoProcAmpProperty.Gain, cameraValue.Gain, VideoProcAmpFlags.Manual);
  246. //WebCam.SetVideoProcAmpProperties(VideoProcAmpProperty.Hue, 0, VideoProcAmpFlags.Manual);
  247. WebCam.SetVideoProcAmpProperties(VideoProcAmpProperty.Saturation, cameraValue.Saturation, VideoProcAmpFlags.Manual);
  248. WebCam.SetVideoProcAmpProperties(VideoProcAmpProperty.WhiteBalance, cameraValue.WhiteBalance, VideoProcAmpFlags.Manual);
  249. if (explosionRange!=10)
  250. {
  251. WebCam.SetProperties(CameraControlProperty.Exposure, explosionRange, CameraControlFlags.Manual);
  252. }
  253. Thread.Sleep(1000);
  254. UpdateRoiPos(true);
  255. GrabSignal(10);
  256. int threshold_gray = 5; // 色点过滤阈值
  257. int threshold_hue = 5; // 色相偏移阈值
  258. ColorPoint cp = Globals.Camera.SampleBackground("d1camera", threshold_gray, threshold_hue);
  259. //logger.LogCritical($"22222222亮度:{cameraValue.Brightness} 对比:{cameraValue.Contrast} 锐度:{cameraValue.Sharpness} 增益:{cameraValue.Gain} 曝光:{explosionRange};***色值:{cp.Hue}");
  260. logger.LogCritical($"22222222亮度:{cameraValue.Brightness} 对比:{cameraValue.Contrast} 饱和度:{cameraValue.Saturation}" +
  261. $" 白平衡:{cameraValue.WhiteBalance} 锐度:{cameraValue.Sharpness} 增益:{cameraValue.Gain} 曝光: {explosionRange};***色值:{cp.Hue}");
  262. //Random rd = new Random();
  263. //string name = System.DateTime.Now.ToString("yyyyMMddHHmmss") + rd.ToString() + ".bmp";
  264. //imgBitmap.Save("C:\\Users\\25109\\Desktop\\软件版本库\\测试文件\\高锰测试\\摄像2图片\\"+ name);
  265. }
  266. public void ShowParammanual()
  267. {
  268. // WebCam.GetVideoProcAmpPropertiesRange(AForge.Video.DirectShow.VideoProcAmpProperty.Brightness, out var minb, out var maxb, out var sizeb, out var valueb, out var flagb);
  269. // WebCam.GetVideoProcAmpPropertiesRange(AForge.Video.DirectShow.VideoProcAmpProperty.Contrast, out var minbc, out var maxbc, out var sizebc, out var valuebc, out var flagbc);
  270. // WebCam.GetVideoProcAmpPropertiesRange(AForge.Video.DirectShow.VideoProcAmpProperty.Hue, out var minbh, out var maxbh, out var sizebh, out var valuebh, out var flagbh);
  271. // WebCam.GetVideoProcAmpPropertiesRange(AForge.Video.DirectShow.VideoProcAmpProperty.Saturation, out var minbs, out var maxbs, out var sizebs, out var valuebs, out var flagbs);
  272. // WebCam.GetVideoProcAmpPropertiesRange(AForge.Video.DirectShow.VideoProcAmpProperty.Sharpness, out var mins, out var maxs, out var sizes, out var values, out var flags);
  273. // WebCam.GetVideoProcAmpPropertiesRange(AForge.Video.DirectShow.VideoProcAmpProperty.WhiteBalance, out var minbw, out var maxbw, out var sizebw, out var valuebw, out var flagbw);
  274. // WebCam.GetVideoProcAmpPropertiesRange(AForge.Video.DirectShow.VideoProcAmpProperty.Gain, out var minbg, out var maxbg, out var sizebg, out var valuebg, out var flagbg);
  275. WebCam.GetVideoProcAmpProperties(AForge.Video.DirectShow.VideoProcAmpProperty.Brightness, out var valuebb, out var flagbb);
  276. WebCam.GetVideoProcAmpProperties(AForge.Video.DirectShow.VideoProcAmpProperty.Contrast, out var valuebcc, out var flagbcc);
  277. WebCam.GetVideoProcAmpProperties(AForge.Video.DirectShow.VideoProcAmpProperty.Hue, out var valuebhh, out var flagbhh);
  278. WebCam.GetVideoProcAmpProperties(AForge.Video.DirectShow.VideoProcAmpProperty.Saturation, out var valuebss, out var flagbss);
  279. WebCam.GetVideoProcAmpProperties(AForge.Video.DirectShow.VideoProcAmpProperty.Sharpness, out var valuess, out var flagss);
  280. WebCam.GetVideoProcAmpProperties(AForge.Video.DirectShow.VideoProcAmpProperty.WhiteBalance, out var valuebww, out var flagbww);
  281. WebCam.GetVideoProcAmpProperties(AForge.Video.DirectShow.VideoProcAmpProperty.Gain, out var valuebgg, out var flagbgg);
  282. WebCam.GetProperties(CameraControlProperty.Exposure, out var exposure, out var flagex);
  283. logger.LogCritical($"22222222亮度:{valuebb} 对比:{valuebcc} 锐度:{valuess} 饱和度:{valuebss} 白平衡:{valuebww} 增益:{valuebgg} 曝光:{exposure} ");
  284. }
  285. /// <summary>
  286. /// 连续采集指定时长的信号值,计算并返回该时长的信号总值和均值
  287. /// </summary>
  288. /// <param name="milsecCount">指定采集时长</param>
  289. /// <returns>信号统计数据</returns>
  290. public ColorData2Point GrabSignal(int milsecCount)
  291. {
  292. if (milsecCount < 35) milsecCount = 500;
  293. IsWorking = true;
  294. ColorData2Point cdp;
  295. var rectRoi = RectROI;
  296. int vr = 0, vg = 0, vb = 0;
  297. var area = rectRoi.Width * rectRoi.Height;
  298. if (Titration2Settings.SensorPara.UseRoiMask && Titration2Settings.SensorPara.RoiMaskPoints is not null)
  299. {
  300. area = Titration2Settings.SensorPara.RoiMaskPoints.Count;
  301. }
  302. // 采集指定时长的数据,计算均值返回
  303. LstColorDataPoints.Clear();
  304. var timeLength = 0;
  305. IsStopGrab = false;
  306. var sw = new Stopwatch();
  307. while (!IsStopGrab)
  308. {
  309. sw.Restart();
  310. var bmp = WebCam.GrabImage2();
  311. if (Titration2Settings.SensorPara.UseRoiMask && Titration2Settings.SensorPara.RoiMaskPoints != null)
  312. {
  313. ColorAnalysis.GetTotalFromImage(bmp, Titration2Settings.SensorPara.RoiMaskPoints, ref vr, ref vg, ref vb);
  314. }
  315. else
  316. {
  317. ColorAnalysis.GetTotalFromImage(bmp, rectRoi, ref vr, ref vg, ref vb);
  318. }
  319. //Random rd = new Random();
  320. //string name = System.DateTime.Now.ToString("yyyyMMddHHmmss") + rd.Next().ToString() + ".bmp";
  321. //bmp.Save("C:\\Users\\25109\\Desktop\\软件版本库\\测试文件\\高锰测试\\摄像2图片\\" + name);
  322. cdp = new ColorData2Point { Id = LstColorDataPoints.Count, Area = area, RTV = vr, GTV = vg, BTV = vb };
  323. LstColorDataPoints.Add(cdp); // 加入队列保存
  324. // 固定每帧图像间隔
  325. if (sw.ElapsedMilliseconds >= Interval)
  326. {
  327. sw.Stop();
  328. }
  329. else
  330. {
  331. Thread.Sleep(Interval - Convert.ToInt32(sw.ElapsedMilliseconds));
  332. }
  333. // 是否已到指定时长,结束采集
  334. timeLength += Interval;
  335. if (timeLength >= milsecCount)
  336. {
  337. break;
  338. }
  339. }
  340. var lstSort = LstColorDataPoints.OrderByDescending(c => c.GTV).ToList();
  341. var nMedianPos = Convert.ToInt32(Math.Ceiling(lstSort.Count / 2.0));
  342. cdp = lstSort[nMedianPos - 1];
  343. logger.LogCritical($"22222222use r={cdp.GetRSV()},g={cdp.GetGSV()},b={cdp.GetBSV()},h={cdp.GetSaturation()}");
  344. IsWorking = false;
  345. Messager<object>.Send("GraberColorValue2", 300 - cdp.GetBSV());
  346. return cdp;
  347. }
  348. #endregion
  349. #region 未启用
  350. #if false
  351. public void SavePicture(string filename)
  352. {
  353. if (string.IsNullOrWhiteSpace(filename))
  354. {
  355. WebCam.GrabImage().Save(filename);
  356. }
  357. }
  358. /// <summary>
  359. /// 定时拍照采集图像,在后台线程执行
  360. /// </summary>
  361. public void StartGrab()
  362. {
  363. LstColorDataPoints.Clear();
  364. IsStopGrab = false;
  365. if (WebCam == null)
  366. {
  367. return;
  368. }
  369. var thrGrab = new Thread(ImageGrabing)
  370. {
  371. IsBackground = true
  372. };
  373. thrGrab.Start();
  374. }
  375. /// <summary>
  376. /// 结束采集线程
  377. /// </summary>
  378. public void StopGrab()
  379. {
  380. if (LogProgram != null)
  381. {
  382. LogProgram.Debug("StopGrab()");
  383. }
  384. IsStopGrab = true;
  385. }
  386. /// <summary>
  387. /// 根据启停指令连续采集信号值,计算最后的frameCount帧数据并返回信号总值和均值
  388. /// </summary>
  389. /// <param name="frameCount">参与计算的帧数</param>
  390. /// <returns>信号统计数据</returns>
  391. public ColorDataPoint GrabSignalWithFrame(int frameCount)
  392. {
  393. if (frameCount < 10)
  394. {
  395. frameCount = 10;
  396. }
  397. IsWorking = true;
  398. Bitmap bmp;
  399. ColorDataPoint cdp;
  400. Rectangle rectROI = RectROI;
  401. int vr = 0, vg = 0, vb = 0;
  402. int area = rectROI.Width * rectROI.Height;
  403. if (Titration2Settings.SensorPara.UseRoiMask && Titration2Settings.SensorPara.RoiMaskPoints != null)
  404. {
  405. area = Titration2Settings.SensorPara.RoiMaskPoints.Count;
  406. }
  407. // 采集指定时长的数据,计算均值返回
  408. LstColorDataPoints.Clear();
  409. int timelength = 0;
  410. IsStopGrab = false;
  411. Stopwatch sw = new Stopwatch();
  412. while (!IsStopGrab)
  413. {
  414. sw.Restart();
  415. bmp = WebCam.GrabImage(); // 拍照
  416. if (Titration2Settings.SensorPara.UseRoiMask && Titration2Settings.SensorPara.RoiMaskPoints != null)
  417. {
  418. ColorAnalysis.GetTotalFromImage(bmp, Titration2Settings.SensorPara.RoiMaskPoints, ref vr, ref vg,
  419. ref vb);
  420. }
  421. else
  422. {
  423. ColorAnalysis.GetTotalFromImage(bmp, rectROI, ref vr, ref vg, ref vb);
  424. }
  425. cdp = new ColorDataPoint { Id = LstColorDataPoints.Count, Area = area, RTV = vr, GTV = vg, BTV = vb };
  426. LstColorDataPoints.Add(cdp); // 加入队列保存
  427. if (LstColorDataPoints.Count > frameCount)
  428. {
  429. LstColorDataPoints.RemoveAt(0);
  430. }
  431. if (LogProgram != null && PrintDebugLog == true)
  432. {
  433. LogProgram.Info(string.Format("a={0},b={1},c={2},d={3}", cdp.GetRSV(), cdp.GetGSV(), cdp.GetBSV(), cdp.GetSaturation()));
  434. }
  435. // 固定每帧图像间隔
  436. if (sw.ElapsedMilliseconds >= Interval)
  437. {
  438. sw.Stop();
  439. }
  440. else
  441. {
  442. Thread.Sleep(Interval - Convert.ToInt32(sw.ElapsedMilliseconds));
  443. }
  444. // 是否已到指定时长,结束采集
  445. timelength += Interval;
  446. if (timelength >= frameCount)
  447. {
  448. break;
  449. }
  450. }
  451. var lstSort = LstColorDataPoints.OrderByDescending(c => c.GTV).ToList();
  452. var nMedianPos = Convert.ToInt32(Math.Ceiling(lstSort.Count / 2.0));
  453. cdp = lstSort[nMedianPos - 1];
  454. if (LogProgram != null && PrintDebugLog == true)
  455. {
  456. LogProgram.Info(string.Format("use a={0},b={1},c={2},d={3}", cdp.GetRSV(), cdp.GetGSV(), cdp.GetBSV(), cdp.GetSaturation()));
  457. }
  458. IsWorking = false;
  459. //ColorDataGrabed?.Invoke(this, new ColorDataGrabedEventArgs() { ColorPoint = cdp });
  460. return cdp;
  461. }
  462. /// <summary>
  463. /// 固定间隔时间,循环采集图像
  464. /// </summary>
  465. protected void ImageGrabing()
  466. {
  467. IsWorking = true;
  468. Bitmap bmp;
  469. ColorDataPoint cdp;
  470. Rectangle rectROI = RectROI;
  471. int vr = 0, vg = 0, vb = 0;
  472. int area = rectROI.Width * rectROI.Height;
  473. if (Titration2Settings.SensorPara.UseRoiMask && Titration2Settings.SensorPara.RoiMaskPoints != null)
  474. {
  475. if (LogProgram != null)
  476. {
  477. LogProgram.Debug("UseRoiMaskPoints = True");
  478. }
  479. area = Titration2Settings.SensorPara.RoiMaskPoints.Count;
  480. }
  481. if (LogProgram != null)
  482. {
  483. LogProgram.Debug("area = " + area.ToString());
  484. }
  485. Stopwatch sw = new Stopwatch();
  486. while (!IsStopGrab)
  487. {
  488. sw.Restart();
  489. bmp = WebCam.GrabImage();
  490. if (Titration2Settings.SensorPara.UseRoiMask && Titration2Settings.SensorPara.RoiMaskPoints != null)
  491. {
  492. ColorAnalysis.GetTotalFromImage(bmp, Titration2Settings.SensorPara.RoiMaskPoints, ref vr, ref vg,
  493. ref vb);
  494. }
  495. else
  496. {
  497. ColorAnalysis.GetTotalFromImage(bmp, rectROI, ref vr, ref vg, ref vb);
  498. }
  499. cdp = new ColorDataPoint { Id = LstColorDataPoints.Count, Area = area, RTV = vr, GTV = vg, BTV = vb };
  500. LstColorDataPoints.Add(cdp); // 加入队列保存
  501. //if (ColorDataGrabed != null)
  502. //{
  503. // ColorDataGrabed(this, new ColorDataGrabedEventArgs() { ColorPoint = cdp });
  504. //} // 发布采样点事件
  505. if (LogProgram != null && PrintDebugLog == true)
  506. {
  507. LogProgram.Debug(string.Format("a={0}, b={1}, c={2}", cdp.GetRSV(), cdp.GetGSV(), cdp.GetBSV()));
  508. }
  509. if (sw.ElapsedMilliseconds >= Interval)
  510. {
  511. sw.Stop();
  512. }
  513. else
  514. {
  515. Thread.Sleep(Interval - Convert.ToInt32(sw.ElapsedMilliseconds));
  516. }
  517. }
  518. IsWorking = false;
  519. }
  520. #endif
  521. #endregion
  522. }
  523. }