背景分析
在項(xiàng)目中是用basler相機(jī)采圖時(shí),一般用的比較多的遍歷相機(jī)吵护,然后使用CreateFirstDevice這個(gè)函數(shù)獲取相機(jī),有些時(shí)候可能需要同時(shí)連接多個(gè)相機(jī),這里一般是遍歷后睬涧,再循環(huán)打開相機(jī)卒废,根據(jù)打開相機(jī)的SN號(hào)確定是否是自己需要的相機(jī),但如果設(shè)備同時(shí)連接了多個(gè)相機(jī)宙地,我們只使用其中的1到2個(gè)摔认,這時(shí)遍歷打開相機(jī)就會(huì)出現(xiàn)相機(jī)占用情況,而且相機(jī)數(shù)量多的時(shí)候宅粥,遍歷相機(jī)和打開相機(jī)也比較耗時(shí)参袱。
遍歷打開相機(jī)
方法一:遍歷所有相機(jī),獲取相機(jī)的SN編碼跟配置文件中的SN進(jìn)行對(duì)比秽梅,確認(rèn)后再打開相機(jī)抹蚀。
//輸入SN號(hào)
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編碼打開相機(jī)
方法二:在初始化后,直接將已知SN編號(hào)打開相機(jī)企垦。
//使用SN編碼直接打開相機(jī)
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;
}
注意事項(xiàng)
方法二適合在已確認(rèn)連接好SN編號(hào)的相機(jī)的情況下初始化相機(jī)环壤,如果找不到相機(jī),則會(huì)出現(xiàn)創(chuàng)建相機(jī)錯(cuò)誤的bug
相對(duì)而言钞诡,方法一對(duì)相機(jī)列表進(jìn)行比對(duì)郑现,可獲知相機(jī)是否存在,然后再進(jìn)行下一步操作荧降。