HikCamera.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. // 海康相机实例类
  2. using MvCameraControl;
  3. using MvFGCtrlC.NET;
  4. using MvvmScaffoldFrame48.DLL.ConfigTools;
  5. using MvvmScaffoldFrame48.DLL.LogTools;
  6. using MvvmScaffoldFrame48.Model.StorageModel.Configs;
  7. using MvvmScaffoldFrame48.Model.StorageModel.HikVisionCamera;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. namespace MvvmScaffoldFrame48.DLL.CameraTools
  14. {
  15. /// <summary>
  16. /// 海康相机操作类
  17. /// </summary>
  18. public class HikCamera
  19. {
  20. #region 实例
  21. /// <summary>
  22. /// 相机实例
  23. /// </summary>
  24. private IDevice _device = null;
  25. public IDevice Device
  26. {
  27. get
  28. {
  29. return _device;
  30. }
  31. }
  32. /// <summary>
  33. /// 设备事件委托
  34. /// </summary>
  35. public event EventHandler<FrameGrabbedEventArgs> FrameGrabbedEvent;
  36. #endregion
  37. #region 变量
  38. /// <summary>
  39. /// 最后一次帧号记录
  40. /// </summary>
  41. private long lastframeNum = -1;
  42. #endregion
  43. #region 构造函数
  44. /// <summary>
  45. /// 相机构造函数 不加载相机
  46. /// </summary>
  47. public HikCamera()
  48. {
  49. if (_device != null && _device.IsConnected)
  50. {
  51. _device.Close();
  52. _device.Dispose();
  53. }
  54. }
  55. /// <summary>
  56. /// 相机构造函数
  57. /// </summary>
  58. /// <param name="device">相机实例</param>
  59. public HikCamera(IDevice device)
  60. {
  61. if (_device != null && _device.IsConnected)
  62. {
  63. _device.Close();
  64. _device.Dispose();
  65. }
  66. this._device = device ?? throw new Exception("相机实例不能为空");
  67. }
  68. /// <summary>
  69. /// 相机构造函数
  70. /// </summary>
  71. /// <param name="deviceInfo">相机信息</param>
  72. public HikCamera(IDeviceInfo deviceInfo)
  73. {
  74. if (_device != null && _device.IsConnected)
  75. {
  76. _device.Close();
  77. _device.Dispose();
  78. }
  79. try
  80. {
  81. // 打开设备
  82. _device = DeviceFactory.CreateDevice(deviceInfo);
  83. }
  84. catch (Exception ex)
  85. {
  86. throw new Exception(ex.Message);
  87. }
  88. int result = _device.Open();
  89. if (result != MvError.MV_OK)
  90. {
  91. Console.WriteLine("打开相机失败");
  92. return;
  93. }
  94. // 判断是否为gige设备
  95. if (_device is IGigEDevice)
  96. {
  97. // 转换为gigE设备
  98. IGigEDevice gigEDevice = _device as IGigEDevice;
  99. // 探测网络最佳包大小(只对GigE相机有效)
  100. result = gigEDevice.GetOptimalPacketSize(out int optionPacketSize);
  101. if (result != MvError.MV_OK)
  102. {
  103. //Log("Warning: Get Packet Size failed!", result);
  104. }
  105. else
  106. {
  107. result = _device.Parameters.SetIntValue("GevSCPSPacketSize", (long)optionPacketSize);
  108. if (result != MvError.MV_OK)
  109. {
  110. //Log("Warning: Set Packet Size failed!", result);
  111. }
  112. }
  113. }
  114. }
  115. #endregion
  116. #region 共有方法
  117. /// <summary>
  118. /// 重新加载指定相机
  119. /// </summary>
  120. /// <param name="deviceInfo">相机信息</param>
  121. /// <returns>true为加载成功,false为加载失败</returns>
  122. public bool ReLoadCameraDevice(IDeviceInfo deviceInfo)
  123. {
  124. bool Blresult = false;
  125. if (_device != null && _device.IsConnected)
  126. {
  127. _device.Close();
  128. _device.Dispose();
  129. }
  130. try
  131. {
  132. // 打开设备
  133. _device = DeviceFactory.CreateDevice(deviceInfo);
  134. Blresult = true;
  135. }
  136. catch
  137. {
  138. return Blresult;
  139. }
  140. int result = _device.Open();
  141. if (result != MvError.MV_OK)
  142. {
  143. Blresult = false;
  144. return Blresult;
  145. }
  146. // 判断是否为gige设备
  147. if (_device is IGigEDevice)
  148. {
  149. // 转换为gigE设备
  150. IGigEDevice gigEDevice = _device as IGigEDevice;
  151. // 探测网络最佳包大小(只对GigE相机有效)
  152. result = gigEDevice.GetOptimalPacketSize(out int optionPacketSize);
  153. if (result != MvError.MV_OK)
  154. {
  155. //Log("Warning: Get Packet Size failed!", result);
  156. }
  157. else
  158. {
  159. result = _device.Parameters.SetIntValue("GevSCPSPacketSize", (long)optionPacketSize);
  160. if (result != MvError.MV_OK)
  161. {
  162. //Log("Warning: Set Packet Size failed!", result);
  163. }
  164. }
  165. }
  166. return Blresult;
  167. }
  168. public int LoadCameraConfig(LinescanCameraParameterModel cameraParameter)
  169. {
  170. int result = 0;
  171. _device.Parameters.SetFloatValue("ExposureTime", cameraParameter.ExposureTimeValue);
  172. _device.Parameters.SetIntValue("AcquisitionLineRate", cameraParameter.AcquistionLineRateValue);
  173. _device.Parameters.SetIntValue("Width", cameraParameter.Width);
  174. _device.Parameters.SetIntValue("Height", cameraParameter.Height);
  175. _device.Parameters.SetIntValue("OffsetX", cameraParameter.OffsetX);
  176. return result;
  177. }
  178. public int LoadCameraConfig(string cameraParameter)
  179. {
  180. int result = 0;
  181. LinescanCameraParameterModel cameraParameterModel = XMLReadWrite.DeserializeFromString<LinescanCameraParameterModel>(cameraParameter);
  182. if (cameraParameterModel != null)
  183. {
  184. _device.Parameters.SetFloatValue("ExposureTime", cameraParameterModel.ExposureTimeValue);
  185. _device.Parameters.SetIntValue("AcquisitionLineRate", cameraParameterModel.AcquistionLineRateValue);
  186. _device.Parameters.SetIntValue("Width", cameraParameterModel.Width);
  187. _device.Parameters.SetIntValue("Height", cameraParameterModel.Height);
  188. _device.Parameters.SetIntValue("OffsetX", cameraParameterModel.OffsetX);
  189. }
  190. return result;
  191. }
  192. /// <summary>
  193. /// 回调型取图方法-开启采集
  194. /// </summary>
  195. /// <returns></returns>
  196. public bool StartReceiveFuntionSetFrameGrabedEvent()
  197. {
  198. bool result = false;
  199. try
  200. {
  201. if (_device == null) return result;
  202. _device.StreamGrabber.SetImageNodeNum(30);
  203. // 注册回调函数
  204. _device.StreamGrabber.FrameGrabedEvent += FrameGrabbedEventHandler;
  205. int ret = _device.StreamGrabber.StartGrabbing();
  206. if (ret == MvError.MV_OK)
  207. {
  208. result = true;
  209. }
  210. }
  211. catch
  212. {
  213. result = false;
  214. }
  215. return result;
  216. }
  217. /// <summary>
  218. /// 回调型取图方法-关闭采集
  219. /// </summary>
  220. /// <returns></returns>
  221. public bool StopReceiveFuntionSetFrameGrabedEvent()
  222. {
  223. bool result = false;
  224. try
  225. {
  226. if (_device == null) return result;
  227. _device.StreamGrabber.FrameGrabedEvent -= FrameGrabbedEventHandler;
  228. int ret = _device.StreamGrabber.StopGrabbing();
  229. if (ret == MvError.MV_OK)
  230. {
  231. result = true;
  232. }
  233. }
  234. catch
  235. {
  236. result = false;
  237. }
  238. return result;
  239. }
  240. /// <summary>
  241. /// 获取相机图像尺寸信息
  242. /// </summary>
  243. /// <returns></returns>
  244. public CameraImageSizeCModel GetCamereImageSize()
  245. {
  246. CameraImageSizeCModel cameraImageSize = null;
  247. if (_device != null)
  248. {
  249. try
  250. {
  251. _device.Parameters.GetIntValue("Width", out IIntValue PixWidth);
  252. _device.Parameters.GetIntValue("Height", out IIntValue PixHeight);
  253. cameraImageSize = new CameraImageSizeCModel()
  254. {
  255. Height = (int)PixHeight.CurValue,
  256. Width = (int)PixWidth.CurValue
  257. };
  258. }
  259. catch
  260. {
  261. return null;
  262. }
  263. }
  264. return cameraImageSize;
  265. }
  266. #endregion
  267. #region 私有方法
  268. /// <summary>
  269. /// 图像抓取事件处理方法
  270. /// </summary>
  271. private void FrameGrabbedEventHandler(object sender,FrameGrabbedEventArgs e)
  272. {
  273. // 触发外部注册的事件
  274. FrameGrabbedEvent?.Invoke(this, e);
  275. if (lastframeNum == -1)
  276. {
  277. lastframeNum = e.FrameOut.FrameNum;
  278. }
  279. else if (lastframeNum == e.FrameOut.FrameNum - 1)
  280. {
  281. lastframeNum = e.FrameOut.FrameNum;
  282. }
  283. else
  284. {
  285. //丢帧记录
  286. TxtLog.log(string.Format("lost frame: Width[{0}] , Height[{1}] , FrameNum[{2}] ,Frevous[{3}]",
  287. e.FrameOut.Image.Width, e.FrameOut.Image.Height, e.FrameOut.FrameNum, lastframeNum), 6);
  288. Console.WriteLine("lost frame: Width[{0}] , Height[{1}] , FrameNum[{2}] ,Frevous[{3}]",
  289. e.FrameOut.Image.Width, e.FrameOut.Image.Height, e.FrameOut.FrameNum, lastframeNum);
  290. lastframeNum = e.FrameOut.FrameNum;
  291. }
  292. e.FrameOut.Dispose();
  293. }
  294. #endregion
  295. }
  296. }