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

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


文章目录

  • 1 实现步骤
  • 2 代码实现
  • 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 代码实现

 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都被重新赋值,但它还是同一个对象,每次赋值之前存入列表的会跟着一起变)

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

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

实例化相机参数信息对象——实例化放在for循环内部,每个相机都要实例化一个对象objCCamerInfo ;
CCamerInfo objCCamerInfo = new CCamerInfo();
【12】大恒相机SDK C#开发 ——多相机开发,枚举所有相机,并按配置文件中的相机顺序 将所有相机加入设备列表,以便于对每个指定的相机操作
【12】大恒相机SDK C#开发 ——多相机开发,枚举所有相机,并按配置文件中的相机顺序 将所有相机加入设备列表,以便于对每个指定的相机操作