// 海康相机实例类 using MvCameraControl; using MvFGCtrlC.NET; using MvvmScaffoldFrame48.DLL.ConfigTools; using MvvmScaffoldFrame48.DLL.LogTools; using MvvmScaffoldFrame48.Model.StorageModel.Configs; using MvvmScaffoldFrame48.Model.StorageModel.HikVisionCamera; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MvvmScaffoldFrame48.DLL.CameraTools { /// /// 海康相机操作类 /// public class HikCamera { #region 实例 /// /// 相机实例 /// private IDevice _device = null; public IDevice Device { get { return _device; } } /// /// 设备事件委托 /// public event EventHandler FrameGrabbedEvent; #endregion #region 变量 /// /// 最后一次帧号记录 /// private long lastframeNum = -1; #endregion #region 构造函数 /// /// 相机构造函数 不加载相机 /// public HikCamera() { if (_device != null && _device.IsConnected) { _device.Close(); _device.Dispose(); } } /// /// 相机构造函数 /// /// 相机实例 public HikCamera(IDevice device) { if (_device != null && _device.IsConnected) { _device.Close(); _device.Dispose(); } this._device = device ?? throw new Exception("相机实例不能为空"); } /// /// 相机构造函数 /// /// 相机信息 public HikCamera(IDeviceInfo deviceInfo) { if (_device != null && _device.IsConnected) { _device.Close(); _device.Dispose(); } try { // 打开设备 _device = DeviceFactory.CreateDevice(deviceInfo); } catch (Exception ex) { throw new Exception(ex.Message); } int result = _device.Open(); if (result != MvError.MV_OK) { Console.WriteLine("打开相机失败"); return; } // 判断是否为gige设备 if (_device is IGigEDevice) { // 转换为gigE设备 IGigEDevice gigEDevice = _device as IGigEDevice; // 探测网络最佳包大小(只对GigE相机有效) result = gigEDevice.GetOptimalPacketSize(out int optionPacketSize); if (result != MvError.MV_OK) { //Log("Warning: Get Packet Size failed!", result); } else { result = _device.Parameters.SetIntValue("GevSCPSPacketSize", (long)optionPacketSize); if (result != MvError.MV_OK) { //Log("Warning: Set Packet Size failed!", result); } } } } #endregion #region 共有方法 /// /// 重新加载指定相机 /// /// 相机信息 /// true为加载成功,false为加载失败 public bool ReLoadCameraDevice(IDeviceInfo deviceInfo) { bool Blresult = false; if (_device != null && _device.IsConnected) { _device.Close(); _device.Dispose(); } try { // 打开设备 _device = DeviceFactory.CreateDevice(deviceInfo); Blresult = true; } catch { return Blresult; } int result = _device.Open(); if (result != MvError.MV_OK) { Blresult = false; return Blresult; } // 判断是否为gige设备 if (_device is IGigEDevice) { // 转换为gigE设备 IGigEDevice gigEDevice = _device as IGigEDevice; // 探测网络最佳包大小(只对GigE相机有效) result = gigEDevice.GetOptimalPacketSize(out int optionPacketSize); if (result != MvError.MV_OK) { //Log("Warning: Get Packet Size failed!", result); } else { result = _device.Parameters.SetIntValue("GevSCPSPacketSize", (long)optionPacketSize); if (result != MvError.MV_OK) { //Log("Warning: Set Packet Size failed!", result); } } } return Blresult; } public int LoadCameraConfig(LinescanCameraParameterModel cameraParameter) { int result = 0; _device.Parameters.SetFloatValue("ExposureTime", cameraParameter.ExposureTimeValue); _device.Parameters.SetIntValue("AcquisitionLineRate", cameraParameter.AcquistionLineRateValue); _device.Parameters.SetIntValue("Width", cameraParameter.Width); _device.Parameters.SetIntValue("Height", cameraParameter.Height); _device.Parameters.SetIntValue("OffsetX", cameraParameter.OffsetX); return result; } public int LoadCameraConfig(string cameraParameter) { int result = 0; LinescanCameraParameterModel cameraParameterModel = XMLReadWrite.DeserializeFromString(cameraParameter); if (cameraParameterModel != null) { _device.Parameters.SetFloatValue("ExposureTime", cameraParameterModel.ExposureTimeValue); _device.Parameters.SetIntValue("AcquisitionLineRate", cameraParameterModel.AcquistionLineRateValue); _device.Parameters.SetIntValue("Width", cameraParameterModel.Width); _device.Parameters.SetIntValue("Height", cameraParameterModel.Height); _device.Parameters.SetIntValue("OffsetX", cameraParameterModel.OffsetX); } return result; } /// /// 回调型取图方法-开启采集 /// /// public bool StartReceiveFuntionSetFrameGrabedEvent() { bool result = false; try { if (_device == null) return result; _device.StreamGrabber.SetImageNodeNum(30); // 注册回调函数 _device.StreamGrabber.FrameGrabedEvent += FrameGrabbedEventHandler; int ret = _device.StreamGrabber.StartGrabbing(); if (ret == MvError.MV_OK) { result = true; } } catch { result = false; } return result; } /// /// 回调型取图方法-关闭采集 /// /// public bool StopReceiveFuntionSetFrameGrabedEvent() { bool result = false; try { if (_device == null) return result; _device.StreamGrabber.FrameGrabedEvent -= FrameGrabbedEventHandler; int ret = _device.StreamGrabber.StopGrabbing(); if (ret == MvError.MV_OK) { result = true; } } catch { result = false; } return result; } /// /// 获取相机图像尺寸信息 /// /// public CameraImageSizeCModel GetCamereImageSize() { CameraImageSizeCModel cameraImageSize = null; if (_device != null) { try { _device.Parameters.GetIntValue("Width", out IIntValue PixWidth); _device.Parameters.GetIntValue("Height", out IIntValue PixHeight); cameraImageSize = new CameraImageSizeCModel() { Height = (int)PixHeight.CurValue, Width = (int)PixWidth.CurValue }; } catch { return null; } } return cameraImageSize; } #endregion #region 私有方法 /// /// 图像抓取事件处理方法 /// private void FrameGrabbedEventHandler(object sender,FrameGrabbedEventArgs e) { // 触发外部注册的事件 FrameGrabbedEvent?.Invoke(this, e); if (lastframeNum == -1) { lastframeNum = e.FrameOut.FrameNum; } else if (lastframeNum == e.FrameOut.FrameNum - 1) { lastframeNum = e.FrameOut.FrameNum; } else { //丢帧记录 TxtLog.log(string.Format("lost frame: Width[{0}] , Height[{1}] , FrameNum[{2}] ,Frevous[{3}]", e.FrameOut.Image.Width, e.FrameOut.Image.Height, e.FrameOut.FrameNum, lastframeNum), 6); Console.WriteLine("lost frame: Width[{0}] , Height[{1}] , FrameNum[{2}] ,Frevous[{3}]", e.FrameOut.Image.Width, e.FrameOut.Image.Height, e.FrameOut.FrameNum, lastframeNum); lastframeNum = e.FrameOut.FrameNum; } e.FrameOut.Dispose(); } #endregion } }