【12】大恒相机SDK C#开发 ——多相机开发,枚举所有相机,并按配置文件中的相机顺序 将所有相机加入设备列表,以便于对每个指定的相机操作

文章目录

  • [1 实现步骤](#1 实现步骤)
  • [2 代码实现](#2 代码实现)
  • [3 遇到的问题及解决](#3 遇到的问题及解决)

多相机开发,枚举所有相机,并按配置文件中的相机顺序 将所有相机加入设备列表,以便于对每个指定的相机操作;

1 实现步骤

步骤:

  • 枚举同一网络下所有相机;
  • 将所有相机的SN加入m_strAllSN数组;
  • 将所有相机按照config.ini中的SN顺序排序,加入相机参数状态列表;
    • 如果,找到与 config.ini中的SN编为m_sorted_strSN[j]对应的相机,就将该相机信息存入m_listCCamerInfo;
    • 如果,自动获取的相机列表中没有找到m_sorted_strSN[j],说明该相机不可以可用;
    • 为了,保持了相机的顺序不变------当第j个相机没有检测到时,在列表m_listCCamerInfo中第j个位置添加一个占位信息,确保第j+1个相机信息可以正确的存入列表m_listCCamerInfo中第j+1个位置,保持了相机的顺序不变。

2 代码实现

csharp 复制代码
  private void __EnumDevice()
  {
      m_listIGXDeviceInfo.Clear();
      if (null != m_objIGXFactory)
      {
          ////枚举同一网段下的相机
          //m_objIGXFactory.UpdateDeviceList(200, m_listIGXDeviceInfo);
          ////枚举同一网络下所有相机 有ALL
          m_objIGXFactory.UpdateAllDeviceList(200, m_listIGXDeviceInfo);

      }

      // 判断当前连接设备个数
      if (m_listIGXDeviceInfo.Count <= 0)
      {
          MessageBox.Show("未检测到设备,请确保设备正常连接然后重启程序!");
          return;
      }

      m_RealCamNum = m_listIGXDeviceInfo.Count;
      m_cb_EnumDevice.Items.Clear();

      //将所有相机的SN加入m_strAllSN数组
      string[] m_strAllSN = new string[m_SetCamNum];       ///<序列号
      for (int i = 0, j = 0; i < m_RealCamNum; i++)
      {
          m_strAllSN[i] = m_listIGXDeviceInfo[i].GetSN();
      }

      bool isFindThisCamera = false;
      int k = 0;
      //将所有相机按照config.ini中的SN顺序排序,加入相机参数状态列表
      for (int j = 0; j < m_SetCamNum; j++)
      {
          //是否找到标志,每次进入先重置。
          isFindThisCamera = false;

          for (int i = 0; i < m_RealCamNum; i++)
          {
              //找到与 config.ini中的SN编为m_sorted_strSN[j]对应的相机
              if (m_sorted_strSN[j] == m_strAllSN[i])//相机1
              {
                  isFindThisCamera = true;
                  k = i;//k保存 与m_sorted_strSN[j]对应的相机的下标
                  break;
              }
          }

          //实例化相机参数信息对象------每个相机都要实例化一个对象,不可以在循环外面创建一个对象,每次循环改变赋值(这也那个最终m_listCCamerInfo中5个元素相同)
          CCamerInfo objCCamerInfo = new CCamerInfo();
          
          //如果,找到与 config.ini中的SN编为m_sorted_strSN[j]对应的相机,就将该相机信息存入m_listCCamerInfo;
          if (isFindThisCamera)
          {
              objCCamerInfo.m_strDisplayName = m_listIGXDeviceInfo[k].GetDisplayName();   
              objCCamerInfo.m_emDeviceType = m_listIGXDeviceInfo[k].GetDeviceClass();
              objCCamerInfo.m_strSN = m_listIGXDeviceInfo[k].GetSN();
              objCCamerInfo.m_CamUserName_strSN = m_listIGXDeviceInfo[k].GetUserID() + objCCamerInfo.m_strSN;

              m_cb_EnumDevice.Items.Add(objCCamerInfo.m_CamUserName_strSN);

              //设备信息加入相机参数状态列表
              m_listCCamerInfo.Add(objCCamerInfo);
          }
          
          //如果,自动获取的相机列表中没有找到m_sorted_strSN[j],说明该相机不可以可用,
          //当第j个相机没有检测到时,在列表m_listCCamerInfo中第j个位置添加一个占位信息,确保第j+1个相机信息可以正确的存入列表m_listCCamerInfo中第j+1个位置,保持了相机的顺序不变。
          else
          {
              //将 objCCamerInfo 信息置为空,表示一个占位信息
              objCCamerInfo.m_strDisplayName = null;
              objCCamerInfo.m_strDeviceUserName = null;            
              objCCamerInfo.m_strSN = null;

              //设备信息加入相机参数状态列表
              m_listCCamerInfo.Add(objCCamerInfo);
          }

          if (j + 1 == m_SetCamNum)
              break;             
      }
       

      if (m_cb_EnumDevice.Items.Count > 0)
      {
          m_cb_EnumDevice.SelectedIndex = 0;
      }

      //选择ComboBox中的设备
      for (int i = 0; i < m_SetCamNum; i++)
      {
          if (m_cb_EnumDevice.Text == m_listCCamerInfo[i].m_CamUserName_strSN)
          {
              m_nOperateID = i;//操作相机编号
          }
      }

      __UpdateUI_Btn_State(m_nOperateID);
  }

3 遇到的问题及解决

实例化相机参数信息对象------每个相机都要实例化一个对象,不可以在循环外面创建一个对象,每次循环改变赋值(这也那个最终m_listCCamerInfo中5个元素相同)

实例化相机参数信息对象------实例化放在for循环外面,CCamerInfo objCCamerInfo = new CCamerInfo();

(虽然每次进入for循环objCCamerInfo都被重新赋值,但它还是同一个对象,每次赋值之前存入列表的会跟着一起变)

实例化相机参数信息对象------实例化放在for循环内部,每个相机都要实例化一个对象objCCamerInfo ;

CCamerInfo objCCamerInfo = new CCamerInfo();

相关推荐
燃尽了,可无3 小时前
C#基础编程核心知识点总结
开发语言·c#
我不是程序猿儿5 小时前
【C#】观察者模式 + UI 线程调度、委托讲解
观察者模式·ui·c#
专注VB编程开发20年5 小时前
c# .net支持 NativeAOT 或 Trimming 的库是什么原理
前端·javascript·c#·.net
钢铁男儿6 小时前
C# 简单工厂模式(简单工厂模式如何工作)
前端·c#·简单工厂模式
isyoungboy8 小时前
c#实现鼠标mousemove事件抽稀,避免大数据阻塞网络
c#·计算机外设·远程桌面·deskflow
一枚小小程序员哈12 小时前
基于asp.net 的在线餐饮订餐系统的设计与实现/基于c#的网上订餐系统/餐厅管理系统
后端·c#·asp.net
好望角雾眠12 小时前
第三阶段数据库-7:sql中函数,运算符,常用关键字
数据库·笔记·sql·学习·sqlserver·c#
海绵宝宝汉堡包16 小时前
c# 项目 文件夹
开发语言·c#
曹牧19 小时前
C#:窗体间传值
c#
一个会的不多的人1 天前
C# NX二次开发:面收集器控件和曲线收集器控件详解
开发语言·c#