c# 海康照相机操作封装类(网口,USB)

需求

        在上位机开发中, 海康照相机的使用应该是很常见的,主要是网口通讯的相机用的多,有时也会用一些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

                主要是相机的基本属性,如索引,名称,描述,相机类型

                

/// 
/// 相机实体
/// 
public class CameraModel
{
    /// 
    /// 索引
    /// 
    public int Index { get; set; }

    /// 
    /// 相机名称
    /// 
    public string Name { get; set; }

    /// 
    /// 描述
    /// 
    public string Description { get; set; }

    /// 
    /// 相机类型 MyCamera.MV_GIGE_DEVICE,MyCamera.MV_USB_DEVICE
    /// 
    public uint nTLayerType { get; set; }
}

        相机公共方法类 HKCamComm

                主要是一些公共方法。加载所有相机,相机列表,相机初始化,关闭相机

/// 
/// 照相机(海康) 公共方法
/// 
public class HKCamComm
{
    /// 
    /// 相机 列表
    /// 
    public static MyCamera.MV_CC_DEVICE_INFO_LIST CameraList = new MyCamera.MV_CC_DEVICE_INFO_LIST();

    /// 
    /// 相机 列表 (相机名称,CameraList的索引)
    /// 
    private static Dictionary CameraNameAndIndexDic = new Dictionary();

    /// 
    /// 加载相机
    /// 
    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

你可能感兴趣的:(上位机,数码相机,经验分享,笔记,c#)