CameraOperationClass.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Drawing;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. using Extensometer.Model;
  12. using Extensometer.Model.ResultModel;
  13. using Extensometer.Model.RequestModel;
  14. using ThridLibray;
  15. namespace Extensometer.BLL
  16. {
  17. public class CameraOperationClass
  18. {
  19. #region 变量和实例
  20. // 项目路径
  21. public string ProjectPath = string.Empty;
  22. // 存储图像完整地址
  23. string ImagePath;
  24. string GetObjectPath;
  25. // 图像存储变量
  26. Bitmap bitmap = null;
  27. // 图片获取线程
  28. bool m_bGetCamImage = true;
  29. // 相机实例
  30. private IDevice m_dev;
  31. // 锁
  32. public Mutex m_mutex = new Mutex();
  33. // 存图开启标志
  34. bool MapIsSaveLoop = false;
  35. // 相机图像缓存列表
  36. List<IGrabbedRawData> m_frameList = new List<IGrabbedRawData>();
  37. // Bitmap图像绑定时间列表
  38. public Queue<TimeImageClass> BitmapImageList = new Queue<TimeImageClass>();
  39. // Bitmap图像存图列表
  40. public Queue<TimeImageClass> SaveImageList = new Queue<TimeImageClass>();
  41. // 存图线程
  42. Thread SaveImageThread;
  43. //取图线程
  44. Thread GetCamImageThread;
  45. Stopwatch m_stopWatch = new Stopwatch();
  46. //创建一个不能被外部直接调用的CameraOperationClass实例
  47. private static readonly CameraOperationClass cameraOperationClass = new CameraOperationClass();
  48. // 保存图片间隔标志量
  49. private int DEFAULT_INTERVAL = 1000;
  50. #endregion
  51. #region 公共方法
  52. /// <summary>
  53. /// 获取CameraOperaTionClass实例
  54. /// </summary>
  55. /// <returns></returns>
  56. public static CameraOperationClass GetCameraOperation()
  57. {
  58. return cameraOperationClass;
  59. }
  60. /// <summary>
  61. /// 获取相机像素长宽
  62. /// </summary>
  63. /// <returns></returns>
  64. public ResultCamSizeModel GetCamImageSize()
  65. {
  66. ResultCamSizeModel resultCamSize = new ResultCamSizeModel();
  67. if (m_dev == null)
  68. {
  69. resultCamSize.ErrCode = ErrCodeList.CamUnLoad;
  70. resultCamSize.ErrMessage = "相机未加载";
  71. return resultCamSize;
  72. }
  73. //获取相机像素宽
  74. using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageWidth])
  75. {
  76. resultCamSize.Width = p.GetValue();
  77. }
  78. //获取相机像素高
  79. using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageHeight])
  80. {
  81. resultCamSize.Hight = p.GetValue();
  82. }
  83. resultCamSize.ErrCode = ErrCodeList.Success;
  84. return resultCamSize;
  85. }
  86. /// <summary>
  87. /// 获取到设备型号
  88. /// </summary>
  89. /// <returns></returns>
  90. public ResultStringModel GetCamDeviceInfo_Model()
  91. {
  92. ResultStringModel result = new ResultStringModel();
  93. try
  94. {
  95. if (m_dev != null)
  96. {
  97. result.ResultValue = m_dev.DeviceInfo.Model;
  98. result.ErrCode = ErrCodeList.Success;
  99. }
  100. else
  101. {
  102. result.ErrCode = ErrCodeList.CamUnLoad;
  103. result.ErrMessage = "未识别到已加载的相机";
  104. }
  105. }
  106. catch (Exception e)
  107. {
  108. result.ErrCode = ErrCodeList.OtherErr;
  109. result.ErrMessage = e.ToString();
  110. }
  111. return result;
  112. }
  113. /// <summary>
  114. /// 获取到相机曝光值
  115. /// </summary>
  116. /// <returns></returns>
  117. public ResultDoubleModel GetCamExposureTime()
  118. {
  119. ResultDoubleModel result = new ResultDoubleModel();
  120. try
  121. {
  122. if (m_dev != null)
  123. {
  124. using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ExposureTime])
  125. {
  126. result.resultValue = p.GetValue();
  127. }
  128. result.ErrCode = ErrCodeList.Success;
  129. }
  130. else
  131. {
  132. result.ErrCode = ErrCodeList.CamUnLoad;
  133. result.ErrMessage = "未识别到已加载的相机";
  134. }
  135. }
  136. catch (Exception e)
  137. {
  138. result.ErrCode = ErrCodeList.OtherErr;
  139. result.ErrMessage = e.ToString();
  140. }
  141. return result;
  142. }
  143. /// <summary>
  144. /// 获取到相机增益
  145. /// </summary>
  146. /// <returns></returns>
  147. public ResultDoubleModel GetCamGainRaw()
  148. {
  149. ResultDoubleModel result = new ResultDoubleModel();
  150. try
  151. {
  152. if (m_dev != null)
  153. {
  154. using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.GainRaw])
  155. {
  156. result.resultValue = p.GetValue();
  157. }
  158. result.ErrCode = ErrCodeList.Success;
  159. }
  160. else
  161. {
  162. result.ErrCode = ErrCodeList.CamUnLoad;
  163. result.ErrMessage = "未识别到已加载的相机";
  164. }
  165. }
  166. catch (Exception e)
  167. {
  168. result.ErrCode = ErrCodeList.OtherErr;
  169. result.ErrMessage = e.ToString();
  170. }
  171. return result;
  172. }
  173. /// <summary>
  174. /// 获取到相机帧率
  175. /// </summary>
  176. /// <returns></returns>
  177. public ResultDoubleModel GetCamAcquisitionFrameRate()
  178. {
  179. ResultDoubleModel result = new ResultDoubleModel();
  180. try
  181. {
  182. if (m_dev != null)
  183. {
  184. using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.AcquisitionFrameRate])
  185. {
  186. result.resultValue = p.GetValue();
  187. }
  188. result.ErrCode = ErrCodeList.Success;
  189. }
  190. else
  191. {
  192. result.ErrCode = ErrCodeList.CamUnLoad;
  193. result.ErrMessage = "未识别到已加载的相机";
  194. }
  195. }
  196. catch (Exception e)
  197. {
  198. result.ErrCode = ErrCodeList.OtherErr;
  199. result.ErrMessage = e.ToString();
  200. }
  201. return result;
  202. }
  203. /// <summary>
  204. /// 加载相机的默认状态
  205. /// </summary>
  206. /// <returns></returns>
  207. public ResultModel CamLoadDefault()
  208. {
  209. ResultModel result = new ResultModel();
  210. if (m_dev != null)
  211. {
  212. try
  213. {
  214. m_dev.StreamGrabber.ImageGrabbed -= OnImageGrabbed; // 反注册回调
  215. m_dev.ShutdownGrab(); // 停止码流
  216. m_dev.Close(); // 关闭相机
  217. }
  218. catch
  219. {
  220. }
  221. }
  222. Enumerator.EnumerateDevices();
  223. m_dev = Enumerator.GetDeviceByIndex(0);
  224. //判断是否成功找到相机
  225. if (m_dev == null)
  226. {
  227. result.ErrCode = ErrCodeList.CamUnFound;
  228. result.ErrMessage = "未找到相机";
  229. return result;
  230. }
  231. // 注册链接事件
  232. m_dev.CameraOpened += OnCameraOpen;
  233. m_dev.ConnectionLost += OnConnectLoss;
  234. m_dev.CameraClosed += OnCameraClose;
  235. // 打开设备
  236. if (!m_dev.Open())
  237. {
  238. result.ErrCode = ErrCodeList.CamOpenErr;
  239. result.ErrMessage = "相机打开失败";
  240. return result;
  241. }
  242. //打开初始配置
  243. //m_dev.UserSet.Current = UserSetType.userSetDefault;
  244. // 设置曝光
  245. // set ExposureTime
  246. //using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ExposureTime])
  247. //{
  248. // p.SetValue(10000);
  249. //}
  250. // 设置缓存个数为8(默认值为16)
  251. m_dev.StreamGrabber.SetBufferCount(8);
  252. // 注册码流回调事件
  253. m_dev.StreamGrabber.ImageGrabbed += OnImageGrabbed;
  254. // 开启码流
  255. if (!m_dev.GrabUsingGrabLoopThread())
  256. {
  257. result.ErrCode = ErrCodeList.CamOpenGrabbingErr;
  258. result.ErrMessage = "相机码流打开失败";
  259. return result;
  260. }
  261. result.ErrCode = ErrCodeList.Success;
  262. return result;
  263. }
  264. /// <summary>
  265. /// 加载相机的默认状态(裁剪)
  266. /// </summary>
  267. /// <returns></returns>
  268. public ResultModel CamLoadDefault(RequestFrameCuttingModel requestFrameCutting)
  269. {
  270. ResultModel result = new ResultModel();
  271. if (m_dev != null)
  272. {
  273. try
  274. {
  275. m_dev.StreamGrabber.ImageGrabbed -= OnImageGrabbed; // 反注册回调
  276. m_dev.ShutdownGrab(); // 停止码流
  277. m_dev.Close(); // 关闭相机
  278. }
  279. catch
  280. {
  281. }
  282. }
  283. Enumerator.EnumerateDevices();
  284. m_dev = Enumerator.GetDeviceByIndex(0);
  285. //判断是否成功找到相机
  286. if (m_dev == null)
  287. {
  288. result.ErrCode = ErrCodeList.CamUnFound;
  289. result.ErrMessage = "未找到相机";
  290. return result;
  291. }
  292. // 注册链接事件
  293. m_dev.CameraOpened += OnCameraOpen;
  294. m_dev.ConnectionLost += OnConnectLoss;
  295. m_dev.CameraClosed += OnCameraClose;
  296. // 打开设备
  297. if (!m_dev.Open())
  298. {
  299. result.ErrCode = ErrCodeList.CamOpenErr;
  300. result.ErrMessage = "相机打开失败";
  301. return result;
  302. }
  303. //打开初始配置
  304. //m_dev.UserSet.Current = UserSetType.userSetDefault;
  305. using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageOffsetX])
  306. {
  307. p.SetValue(requestFrameCutting.StartPoint.X);
  308. long b = p.GetValue();
  309. }
  310. using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageOffsetY])
  311. {
  312. p.SetValue(requestFrameCutting.StartPoint.Y);
  313. long b = p.GetValue();
  314. }
  315. using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageHeight])
  316. {
  317. p.SetValue(Math.Abs(requestFrameCutting.EndPoint.Y - requestFrameCutting.StartPoint.Y));
  318. long a = p.GetValue();
  319. }
  320. using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageWidth])
  321. {
  322. p.SetValue(Math.Abs(requestFrameCutting.EndPoint.X - requestFrameCutting.StartPoint.X));
  323. long b = p.GetValue();
  324. }
  325. // 设置曝光
  326. // set ExposureTime
  327. //using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ExposureTime])
  328. //{
  329. // p.SetValue(10000);
  330. //}
  331. // 设置缓存个数为8(默认值为16)
  332. m_dev.StreamGrabber.SetBufferCount(8);
  333. // 注册码流回调事件
  334. m_dev.StreamGrabber.ImageGrabbed += OnImageGrabbed;
  335. // 开启码流
  336. if (!m_dev.GrabUsingGrabLoopThread())
  337. {
  338. result.ErrCode = ErrCodeList.CamOpenGrabbingErr;
  339. result.ErrMessage = "相机码流打开失败";
  340. return result;
  341. }
  342. result.ErrCode = ErrCodeList.Success;
  343. return result;
  344. }
  345. /// <summary>
  346. /// 开启或关闭图像保存(状态切换)
  347. /// </summary>
  348. /// <param name="ObjectPath">项目图片保存路径</param>
  349. /// <returns></returns>
  350. public ResultModel StartOrStopSaveImage(string ObjectPath)
  351. {
  352. ResultModel result = new ResultModel();
  353. try
  354. {
  355. if (string.IsNullOrEmpty(ObjectPath))
  356. {
  357. result.ErrCode = ErrCodeList.PathEmpty;
  358. result.ErrMessage = "项目地址为空";
  359. return result;
  360. }
  361. // 存图标志量值切换
  362. MapIsSaveLoop = MapIsSaveLoop ? false : true;
  363. if(MapIsSaveLoop)
  364. {
  365. //初始化并运行存图线程
  366. m_bSaveImage = true;
  367. SaveImageThread = new Thread(SaveImage);
  368. SaveImageThread.Start();
  369. }
  370. else
  371. {
  372. m_bSaveImage = false;
  373. }
  374. GetObjectPath = ObjectPath;
  375. result.ErrCode = ErrCodeList.Success;
  376. }
  377. catch (Exception ex)
  378. {
  379. result.ErrCode = ErrCodeList.OtherErr;
  380. result.ErrMessage = ex.Message;
  381. }
  382. return result;
  383. }
  384. /// <summary>
  385. /// 相机画面裁剪
  386. /// </summary>
  387. /// <param name="requestFrameCutting"></param>
  388. /// <returns></returns>
  389. public ResultModel ChangeCamFrameSize(RequestFrameCuttingModel requestFrameCutting)
  390. {
  391. ResultModel result = new ResultModel();
  392. if (m_dev != null)
  393. {
  394. try
  395. {
  396. m_dev.StreamGrabber.ImageGrabbed -= OnImageGrabbed; // 反注册回调
  397. m_dev.ShutdownGrab(); // 停止码流
  398. m_dev.Close(); // 关闭相机
  399. }
  400. catch
  401. {
  402. }
  403. }
  404. Enumerator.EnumerateDevices();
  405. m_dev = Enumerator.GetDeviceByIndex(0);
  406. // 注册链接事件
  407. m_dev.CameraOpened += OnCameraOpen;
  408. m_dev.ConnectionLost += OnConnectLoss;
  409. m_dev.CameraClosed += OnCameraClose;
  410. // 打开设备
  411. if (!m_dev.Open())
  412. {
  413. result.ErrCode = ErrCodeList.CamOpenErr;
  414. result.ErrMessage = "相机打开失败";
  415. return result;
  416. }
  417. using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageHeight])
  418. {
  419. p.SetValue(Math.Abs(requestFrameCutting.EndPoint.Y - requestFrameCutting.StartPoint.Y));
  420. double a = p.GetValue();
  421. }
  422. using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageWidth])
  423. {
  424. p.SetValue(Math.Abs(requestFrameCutting.EndPoint.X - requestFrameCutting.StartPoint.X));
  425. double a = p.GetValue();
  426. }
  427. using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageOffsetX])
  428. {
  429. p.SetValue(requestFrameCutting.StartPoint.X);
  430. double a = p.GetValue();
  431. }
  432. using (IIntegraParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ImageOffsetY])
  433. {
  434. p.SetValue(requestFrameCutting.StartPoint.Y);
  435. double a = p.GetValue();
  436. }
  437. m_dev.StreamGrabber.SetBufferCount(8);
  438. // 注册码流回调事件
  439. m_dev.StreamGrabber.ImageGrabbed += OnImageGrabbed;
  440. // 开启码流
  441. if (!m_dev.GrabUsingGrabLoopThread())
  442. {
  443. result.ErrCode = ErrCodeList.CamOpenGrabbingErr;
  444. result.ErrMessage = "相机码流打开失败";
  445. return result;
  446. }
  447. result.ErrCode = ErrCodeList.Success;
  448. return result;
  449. }
  450. /// <summary>
  451. /// 修改相机Gain值
  452. /// </summary>
  453. /// <param name="GainValue"></param>
  454. /// <returns></returns>
  455. public ResultModel ChangeCamGain(int GainValue)
  456. {
  457. ResultModel result = new ResultModel();
  458. if (!(GainValue >= 1 && GainValue <= 32))
  459. {
  460. result.ErrCode = ErrCodeList.ValueRangeErr;
  461. result.ErrMessage = "输入值范围异常";
  462. return result;
  463. }
  464. if (m_dev != null)
  465. {
  466. try
  467. {
  468. m_dev.StreamGrabber.ImageGrabbed -= OnImageGrabbed; // 反注册回调
  469. m_dev.ShutdownGrab(); // 停止码流
  470. m_dev.Close(); // 关闭相机
  471. }
  472. catch
  473. {
  474. }
  475. }
  476. Enumerator.EnumerateDevices();
  477. m_dev = Enumerator.GetDeviceByIndex(0);
  478. // 注册链接事件
  479. m_dev.CameraOpened += OnCameraOpen;
  480. m_dev.ConnectionLost += OnConnectLoss;
  481. m_dev.CameraClosed += OnCameraClose;
  482. // 打开设备
  483. if (!m_dev.Open())
  484. {
  485. result.ErrCode = ErrCodeList.CamOpenErr;
  486. result.ErrMessage = "相机打开失败";
  487. return result;
  488. }
  489. using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.GainRaw])
  490. {
  491. p.SetValue(GainValue);
  492. }
  493. m_dev.StreamGrabber.SetBufferCount(8);
  494. // 注册码流回调事件
  495. m_dev.StreamGrabber.ImageGrabbed += OnImageGrabbed;
  496. // 开启码流
  497. if (!m_dev.GrabUsingGrabLoopThread())
  498. {
  499. result.ErrCode = ErrCodeList.CamOpenGrabbingErr;
  500. result.ErrMessage = "相机码流打开失败";
  501. return result;
  502. }
  503. result.ErrCode = ErrCodeList.Success;
  504. return result;
  505. }
  506. /// <summary>
  507. /// 修改相机ExposureTime值
  508. /// </summary>
  509. /// <param name="ExposureTimeValue"></param>
  510. /// <returns></returns>
  511. public ResultModel ChangeCamExposureTime(int ExposureTimeValue)
  512. {
  513. ResultModel result = new ResultModel();
  514. if (ExposureTimeValue < 16)
  515. {
  516. result.ErrCode = ErrCodeList.ValueRangeErr;
  517. result.ErrMessage = "输入值范围异常";
  518. return result;
  519. }
  520. if (m_dev != null)
  521. {
  522. try
  523. {
  524. m_dev.StreamGrabber.ImageGrabbed -= OnImageGrabbed; // 反注册回调
  525. m_dev.ShutdownGrab(); // 停止码流
  526. m_dev.Close(); // 关闭相机
  527. }
  528. catch
  529. {
  530. }
  531. }
  532. Enumerator.EnumerateDevices();
  533. m_dev = Enumerator.GetDeviceByIndex(0);
  534. // 注册链接事件
  535. m_dev.CameraOpened += OnCameraOpen;
  536. m_dev.ConnectionLost += OnConnectLoss;
  537. m_dev.CameraClosed += OnCameraClose;
  538. // 打开设备
  539. if (!m_dev.Open())
  540. {
  541. result.ErrCode = ErrCodeList.CamOpenErr;
  542. result.ErrMessage = "相机打开失败";
  543. return result;
  544. }
  545. using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.ExposureTime])
  546. {
  547. p.SetValue(ExposureTimeValue);
  548. }
  549. m_dev.StreamGrabber.SetBufferCount(8);
  550. // 注册码流回调事件
  551. m_dev.StreamGrabber.ImageGrabbed += OnImageGrabbed;
  552. // 开启码流
  553. if (!m_dev.GrabUsingGrabLoopThread())
  554. {
  555. result.ErrCode = ErrCodeList.CamOpenGrabbingErr;
  556. result.ErrMessage = "相机码流打开失败";
  557. return result;
  558. }
  559. result.ErrCode = ErrCodeList.Success;
  560. return result;
  561. }
  562. /// <summary>
  563. /// 修改采样帧率
  564. /// </summary>
  565. /// <param name="ExposureTimeValue"></param>
  566. /// <returns></returns>
  567. public ResultModel ChangeCamAcquisitionFrameRate(int AcquisitionFrameRateValue)
  568. {
  569. ResultModel result = new ResultModel();
  570. if (AcquisitionFrameRateValue < 1 || AcquisitionFrameRateValue > 2000)
  571. {
  572. result.ErrCode = ErrCodeList.ValueRangeErr;
  573. result.ErrMessage = "输入值范围异常";
  574. return result;
  575. }
  576. if (m_dev != null)
  577. {
  578. try
  579. {
  580. m_dev.StreamGrabber.ImageGrabbed -= OnImageGrabbed; // 反注册回调
  581. m_dev.ShutdownGrab(); // 停止码流
  582. m_dev.Close(); // 关闭相机
  583. }
  584. catch
  585. {
  586. }
  587. }
  588. Enumerator.EnumerateDevices();
  589. m_dev = Enumerator.GetDeviceByIndex(0);
  590. // 注册链接事件
  591. m_dev.CameraOpened += OnCameraOpen;
  592. m_dev.ConnectionLost += OnConnectLoss;
  593. m_dev.CameraClosed += OnCameraClose;
  594. // 打开设备
  595. if (!m_dev.Open())
  596. {
  597. result.ErrCode = ErrCodeList.CamOpenErr;
  598. result.ErrMessage = "相机打开失败";
  599. return result;
  600. }
  601. using (IBooleanParameter p = m_dev.ParameterCollection[ParametrizeNameSet.AcquisitionFrameRateEnable])
  602. {
  603. p.SetValue(true);
  604. }
  605. using (IFloatParameter p = m_dev.ParameterCollection[ParametrizeNameSet.AcquisitionFrameRate])
  606. {
  607. p.SetValue(AcquisitionFrameRateValue);
  608. }
  609. m_dev.StreamGrabber.SetBufferCount(8);
  610. // 注册码流回调事件
  611. m_dev.StreamGrabber.ImageGrabbed += OnImageGrabbed;
  612. // 开启码流
  613. if (!m_dev.GrabUsingGrabLoopThread())
  614. {
  615. result.ErrCode = ErrCodeList.CamOpenGrabbingErr;
  616. result.ErrMessage = "相机码流打开失败";
  617. return result;
  618. }
  619. result.ErrCode = ErrCodeList.Success;
  620. return result;
  621. }
  622. /// <summary>
  623. /// 关闭相机
  624. /// </summary>
  625. /// <returns></returns>
  626. public ResultModel CloseCam()
  627. {
  628. ResultModel resultModel = new ResultModel();
  629. m_dev.Close();
  630. return resultModel;
  631. }
  632. /// <summary>
  633. /// 查询存图状态
  634. /// </summary>
  635. /// <returns>
  636. /// true:存图开启
  637. /// false: 存图关闭
  638. /// </returns>
  639. public bool IsStartSaveImage()
  640. {
  641. return MapIsSaveLoop;
  642. }
  643. public void ChangSaveImageSpacing(RequestFromConfigModel ReadFromConfig)
  644. {
  645. if(ReadFromConfig.ImageSaveModel==ImageSaveModel.AllSave)
  646. {
  647. DEFAULT_INTERVAL = 0;
  648. }
  649. else if(ReadFromConfig.ImageSaveModel==ImageSaveModel.SpacingSave)
  650. {
  651. DEFAULT_INTERVAL = ReadFromConfig.SpacingSaveImageTime;
  652. }
  653. }
  654. #endregion
  655. #region 私有方法
  656. /// <summary>
  657. /// 初始化CameraOperationClass
  658. /// </summary>
  659. private CameraOperationClass()
  660. {
  661. GetCamImageThread = new Thread(GetCamImage);
  662. GetCamImageThread.Start();
  663. }
  664. // 码流数据回调
  665. private void OnImageGrabbed(Object sender, GrabbedEventArgs e)
  666. {
  667. m_mutex.WaitOne();
  668. m_frameList.Add(e.GrabResult.Clone());
  669. m_mutex.ReleaseMutex();
  670. }
  671. // 相机打开回调
  672. private void OnCameraOpen(object sender, EventArgs e)
  673. {
  674. }
  675. // 相机关闭回调
  676. private void OnCameraClose(object sender, EventArgs e)
  677. {
  678. }
  679. // 相机丢失回调
  680. private void OnConnectLoss(object sender, EventArgs e)
  681. {
  682. m_dev.ShutdownGrab();
  683. m_dev.Dispose();
  684. m_dev = null;
  685. }
  686. /// <summary>
  687. /// 主动回收内存
  688. /// </summary>
  689. private void UserMemoryCollect()
  690. {
  691. GC.Collect();
  692. GC.WaitForPendingFinalizers();
  693. }
  694. /// <summary>
  695. /// 判断是否执行保存操作(帧率限制)
  696. /// </summary>
  697. /// <returns></returns>
  698. private bool isTimeToDisplay()
  699. {
  700. m_stopWatch.Stop();
  701. long m_lDisplayInterval = m_stopWatch.ElapsedMilliseconds;
  702. if (m_lDisplayInterval <= DEFAULT_INTERVAL)
  703. {
  704. m_stopWatch.Start();
  705. return false;
  706. }
  707. else
  708. {
  709. m_stopWatch.Reset();
  710. m_stopWatch.Start();
  711. return true;
  712. }
  713. }
  714. #endregion
  715. #region 线程方法
  716. // 存图线程控制变量
  717. private bool m_bSaveImage = false;
  718. /// <summary>
  719. /// 存图线程
  720. /// </summary>
  721. private void SaveImage()
  722. {
  723. TimeImageClass frame = new TimeImageClass();
  724. while (m_bSaveImage)
  725. {
  726. if (SaveImageList.Count == 0)
  727. {
  728. Thread.Sleep(10);
  729. continue;
  730. }
  731. // 图像队列取最新帧
  732. //m_mutex.WaitOne();
  733. frame = SaveImageList.Dequeue();
  734. //m_mutex.ReleaseMutex();
  735. // 判断是否开启存图
  736. if (!MapIsSaveLoop)
  737. {
  738. continue;
  739. }
  740. // 存图间隔限制
  741. if (!isTimeToDisplay())
  742. {
  743. continue;
  744. }
  745. // 主动调用回收垃圾
  746. UserMemoryCollect();
  747. if (!Directory.Exists(GetObjectPath))
  748. {
  749. Directory.CreateDirectory(GetObjectPath);
  750. continue;
  751. }
  752. ImagePath = GetObjectPath + "\\" + frame.ImageDateTime.ToString("yyyyMMddHHmmssff") + ".bmp";
  753. frame.ImageBitMap.Save(ImagePath, System.Drawing.Imaging.ImageFormat.Bmp);
  754. }
  755. }
  756. /// <summary>
  757. /// 从相机获取图像并处理
  758. /// </summary>
  759. private void GetCamImage()
  760. {
  761. TimeImageClass timeToImage = new TimeImageClass();
  762. while (m_bGetCamImage)
  763. {
  764. if (m_frameList.Count == 0)
  765. {
  766. Thread.Sleep(10);
  767. continue;
  768. }
  769. // 图像队列取最新帧
  770. m_mutex.WaitOne();
  771. IGrabbedRawData frame = m_frameList.ElementAt(0);
  772. if (m_frameList.Count > 10)
  773. {
  774. LOG.error("GetCamImage-m_frameList数据异常抛出,帧丢弃");
  775. m_frameList.Clear();
  776. }
  777. else m_frameList.Remove(frame);
  778. //m_frameList.Remove(frame);
  779. m_mutex.ReleaseMutex();
  780. // 主动调用回收垃圾
  781. UserMemoryCollect();
  782. try
  783. {
  784. lock(this)
  785. {
  786. timeToImage = new TimeImageClass()
  787. {
  788. ImageBitMap = frame.ToBitmap(false),
  789. ImageByte = frame.Image,
  790. ImageDateTime = DateTime.Now
  791. };
  792. // 向相机操作类中的待处理列表添加数据
  793. BitmapImageList.Enqueue(timeToImage);
  794. }
  795. }
  796. catch
  797. {
  798. }
  799. }
  800. }
  801. #endregion
  802. }
  803. }