需求
在上位机开发中, 海康照相机的使用应该是很常见的,主要是网口通讯的相机用的多,有时也会用一些USB接口相机。以前项目都在赶时间做。没有时间去好好设计和封装。时间长了发现重复代码就很多,还有没有设计和封装的代码,代码份数和相机个数对等,说白了就是一个相机写一个相机类,基本都长一样,可能是就IP或相机名称不一样。最近有点空就来优化一下代码。这次优化完后可以直接用在以后的项目中。成熟代码没有BUG,减少重复开发,提高工作效率。
设计思想
用面像对像思想,将相机的常用属性和行为提取。在使用时只要New 一个相机对象就可以,有几个相机New几个就可以,让调用最简单化。
引用
MvCameraControl.Net
sdk 下载:https://download.csdn.net/download/cjh16606260986/88786823
代码调用
Global.CamStandardization = new HKCam(CommonConstant.CamNameStandardization, true);
Global.CamWeldHead = new HKCam(CommonConstant.CamNameWeldHead, false, 2000);
封装代码
分成三个类:
相机类 HKCam,相机公共方法类 HKCamComm,相机基本信息类 CameraModel
相机基本信息类 CameraModel
主要是相机的基本属性,如索引,名称,描述,相机类型
/// <summary>
/// 相机实体
/// </summary>
public class CameraModel
{/// <summary>/// 索引/// </summary>public int Index { get; set; }/// <summary>/// 相机名称/// </summary>public string Name { get; set; }/// <summary>/// 描述/// </summary>public string Description { get; set; }/// <summary>/// 相机类型 MyCamera.MV_GIGE_DEVICE,MyCamera.MV_USB_DEVICE/// </summary>public uint nTLayerType { get; set; }
}
相机公共方法类 HKCamComm
主要是一些公共方法。加载所有相机,相机列表,相机初始化,关闭相机
/// <summary>
/// 照相机(海康) 公共方法
/// </summary>
public class HKCamComm
{/// <summary>/// 相机 列表/// </summary>public static MyCamera.MV_CC_DEVICE_INFO_LIST CameraList = new MyCamera.MV_CC_DEVICE_INFO_LIST();/// <summary>/// 相机 列表 (相机名称,CameraList的索引)/// </summary>private static Dictionary<string, CameraModel> CameraNameAndIndexDic = new Dictionary<string, CameraModel>();/// <summary>/// 加载相机/// </summary>public static string LoadCameraDic(){int nRet = MyCamera.MV_OK;if (CameraNameAndIndexDic.Count == 0){CameraList.nDeviceNum = 0;nRet = MyCamera.MV_CC_EnumDevices_NET(MyCamera.MV_GIGE_DEVICE | MyCamera.MV_USB_DEVICE, ref CameraList);if (MyCamera.MV_OK != nRet)return "没有找到设备!";if (0 == HKCamComm.CameraList.nDeviceNum)return "设备的个数为0!";var count = CameraList.nDeviceNum;if (CameraNameAndIndexDic.Count != count){for (int i = 0; i < count; i++){var cameraModel = new CameraModel();cameraModel.Index = i;MyCamera.MV_CC_DEVICE_INFO device = (MyCamera.MV_CC_DEVICE_INFO)Marshal.PtrToStructure(CameraList.pDeviceInfo[i], typeof(MyCamera.MV_CC_DEVICE_INFO));if (device.nTLayerType == MyCamera.MV_GIGE_DEVICE){//获取相机名MyCamera.MV_GIGE_DEVICE_INFO gigeInfo = (MyCamera.MV_GIGE_DEVICE_INFO)MyCamera.ByteToStruct(device.SpecialInfo.stGigEInfo, typeof(MyCamera.MV_GIGE_DEVICE_INFO));if (!string.IsNullOrEmpty(gigeInfo.chUserDefinedName)){cameraModel.Name = gigeInfo.chUserDefinedName;}else{cameraModel.Name = "GEV: " + gigeInfo.chManufacturerName + " " + gigeInfo.chModelName + " (" + gigeInfo.chSerialNumber + ")";}}else if (device.nTLayerType == MyCamera.MV_USB_DEVICE){MyCamera.MV_USB3_DEVICE_INFO usbInfo = (MyCamera.MV_USB3_DEVICE_INFO)MyCamera.ByteToStruct(device.SpecialInfo.stUsb3VInfo, typeof(MyCamera.MV_USB3_DEVICE_INFO));if (!string.IsNullOrEmpty