背景分析
在項目中是用basler相機采圖時,一般用的比較多的遍歷相機,然后使用CreateFirstDevice這個函數(shù)獲取相機,有些時候可能需要同時連接多個相機,這里一般是遍歷后,再循環(huán)打開相機,根據(jù)打開相機的SN號確定是否是自己需要的相機,但如果設(shè)備同時連接了多個相機,我們只使用其中的1到2個,這時遍歷打開相機就會出現(xiàn)相機占用情況,而且相機數(shù)量多的時候,遍歷相機和打開相機也比較耗時。
遍歷打開相機
方法一:遍歷所有相機,獲取相機的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;
}
}
}
直接根據(jù)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編號的相機的情況下初始化相機,如果找不到相機,則會出現(xiàn)創(chuàng)建相機錯誤的bug
相對而言,方法一對相機列表進行比對,可獲知相機是否存在,然后再進行下一步操作。