背景分析
在项目中是用basler相机采图时,一般用的比较多的遍历相机,然后使用CreateFirstDevice这个函数获取相机,有些时候可能需要同时连接多个相机,这里一般是遍历后,再循环打开相机,根据打开相机的SN号确定是否是自己需要的相机,但如果设备同时连接了多个相机,我们只使用其中的1到2个,这时遍历打开相机就会出现相机占用情况,而且相机数量多的时候,遍历相机和打开相机也比较耗时。
遍历打开相机
方法一:遍历所有相机,获取相机的SN编码跟配置文件中的SN进行对比,确认后再打开相机。
//输入SN号
std::string s = snNumber.toStdString();
DeviceInfoList_t devList;
//初始化
PylonInitialize();
CTlFactory& TlFactory = CTlFactory::GetInstance();
int camNum = TlFactory.EnumerateDevices(devList);
for(int i=0;i<camNum;i++)
{
QString snName = QString(devList[i].GetSerialNumber());
if(snNumber == snName)
{
Pylon::IPylonDevice* pDevice = CTlFactory::GetInstance().CreateDevice( devList[i]);
m_basler.RegisterImageEventHandler(this, RegistrationMode_Append, Cleanup_Delete);
m_basler.Attach(pDevice,Cleanup_Delete);
m_basler.Open();
if (!m_basler.IsOpen() || m_basler.IsGrabbing())
{
qDebug()<<"camera open failed"<<Qt::endl;
return;
}
}
}
直接根据SN编码打开相机
方法二:在初始化后,直接将已知SN编号打开相机。
//使用SN编码直接打开相机
std::string s = snNumber.toStdString();
PylonInitialize();
CDeviceInfo info;
info.SetSerialNumber(s.c_str());
Pylon::IPylonDevice* pDevice = CTlFactory::GetInstance().CreateDevice(info);
m_basler.RegisterImageEventHandler(this, RegistrationMode_Append, Cleanup_Delete);
m_basler.Attach(pDevice,Cleanup_Delete);
m_basler.Open();
if (!m_basler.IsOpen() || m_basler.IsGrabbing())
{
qDebug()<<"camera open failed"<<Qt::endl;
return;
}
注意事项
方法二适合在已确认连接好SN编号的相机的情况下初始化相机,如果找不到相机,则会出现创建相机错误的bug
相对而言,方法一对相机列表进行比对,可获知相机是否存在,然后再进行下一步操作。