参考:http://blog.csdn.net/liyuanbhu/article/details/74841591
参考:http://blog.csdn.net/cocoasprite/article/details/60955012
一、
在设置相机参数之前,先要获取相机对象。Pylon::CTlFactory 具有一个 CreateDevice() 方法可以用来生成一个相机对象,并返回一个指向 IPylonDevice 的指针。下面的代码用来获取枚举出来的第一个相机对应的对象。
-
Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
-
DeviceInfoList_t lstDevices;
-
TlFactory.EnumerateDevices( lstDevices );
-
IPylonDevice * pDevice;
-
if(!lstDevices.empty())
-
{
-
pDevice = TlFactory.CreateDevice(lstDevices[
0]);
-
}
上面的代码还可以简化为:
上面 CreateFirstDevice 函数是用来生成枚举到的第一个相机的接口。我们知道传输层还分 GigE、USB等许多中,如果我们希望直接生成 GigE 接口的第一个相机接口,可以先获得GigE 传输层的接口,然后调用接口中的CreateFirstDevice函数,具体可以参考下面的代码片段:
Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance(); IPylonDevice * pDevice = TlFactory.CreateFirstDevice();
-
Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
-
Pylon::IGigETransportLayer* pTl =
static_cast<Pylon::IGigETransportLayer*> (TlFactory.CreateTl(
"BaslerGigE"));
-
IPylonDevice * pDevice = pTl->CreateFirstDevice();
上一篇博客介绍了相机的参数是用 GenApi Node Maps 数据结构来体现的。这个 Node Maps 的接口类型为 GenApi::INodeMap,可以通过 IPylonDevice 的 GetTLNodeMap() 函数和 GetNodeMap() 函数来获得。顾名思义 GetTLNodeMap() 是用来获得传输层参数的,GetNodeMap() 对应的是相机本身的参数。下面是代码示例。
那么一个相机都有哪些参数,这些参数的名称是什么呢?这就需要参考 GenICam Standard Feature Naming Convention (SFNC)了。Basler 的 USB3 的相机遵守 SFNC 2.0 标准,GigE 和 Firewire 相机只支持 1.x 版本的 SFNC。SFNC 2.0 和 SFNC 1.x 还是有不少差异的。比如相机的增益,在 SFNC 2.0 标准中是浮点型参量,名称为 “Gain”, 在 1.x 中是整数型参量,名称为 “GainRaw”。下面举个例子,我们要获取 “Gain” 这个参量的范围,并且将这个参量的值设为最大最小值的平均值。那我们的代码可以这样写:
Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance(); IPylonDevice * pDevice = TlFactory.CreateFirstDevice(); GenApi::INodeMap* NodeMap = pDevice->GetNodeMap(); GenApi::INodeMap* TLNodeMap = pDevice->GetTLNodeMap();
-
Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
-
IPylonDevice * pDevice = TlFactory.CreateFirstDevice();
-
GenApi::INodeMap* NodeMap = pDevice->GetNodeMap();
-
GenApi::INode *pNode = pNodeMap->GetNode(
"Gain");
-
GenApi::
CFloatPtr gain(pNode);
-
float gainMin = gain->GetMin();
-
float gainMax = gain->GetMax();
-
qDebug() <<
"current gain = " << gain->GetValue();
-
gain->SetValue(gainMin + (gainMax - gainMin) /
2.0);
这里我们要注意几个地方,首先如果我们的相机不支持 Gain 这个参数,那么 pNode 将是空指针。后面的操作就会报错。第二,Gain 这个参数不一定可读可写,如果不可读 gain->GetMin() 就会报错。如果不可写,那么 gain->SetValue() 就会报错。所以我们应该用 GenApi::IsReadable() 和 GenApi::IsWritable() 来测试这个 INode 接口是否可以读写。另外还有一点需要特别注意,相机的参数都是在相机被打开后才可以读写的。如果我们知道相机是哪个传输层的,还可以有更简单的访问方式。比如我们的相机是 GigE 接口的,那么可以从 pDevice 构造一个 CBaslerGigEInstantCamera 对象,然后通过这个对象访问相机的各个属性。比如下面的代码:
-
Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
-
Pylon::IGigETransportLayer* pTl =
static_cast<Pylon::IGigETransportLayer*> (TlFactory.CreateTl(
"BaslerGigE"));
-
-
IPylonDevice * pDevice = pTl->CreateFirstDevice();
-
CBaslerGigEInstantCamera camera(pDevice);
-
camera.Open();
-
qDebug() << GenApi::IsReadable(camera.GainRaw);
-
qDebug() <<
"GainRaw = " << camera.GainRaw.GetValue();
-
qDebug() <<
"GainRaw.GetMax() = " << camera.GainRaw.GetMax();
-
qDebug() << GenApi::IsWritable(camera.GainRaw);
-
camera.GainRaw = camera.GainRaw.GetMax();
-
camera.GainRaw.SetValue(camera.GainRaw.GetMin());
-
camera.Close();
二、具体例子
-
/*index = 0//设置相机的内触发
-
= 1//设置相机的外触发
-
= 2//设置相机的曝光时间
-
= 3//设置相机的增益
-
= 4//相机的频率
-
= 5//图片的宽度
-
= 6//图片的高度
-
= 7//灯的触发信号
-
*/
-
static void SetupCamera( Pylon::CInstantCamera& camera, int index)
-
{
-
int i =
0;
-
try
-
{
-
using
namespace GenApi;
-
INodeMap &cameraNodeMap = camera.GetNodeMap();
-
-
if(index ==
0)
-
{
-
CEnumerationPtr ptrTriggerSel = cameraNodeMap.GetNode (
"TriggerSelector");
-
ptrTriggerSel->FromString(
"FrameStart");
-
CEnumerationPtr ptrTrigger = cameraNodeMap.GetNode (
"TriggerMode");
-
ptrTrigger->SetIntValue(
0);
-
}
-
else
if(index ==
1)
-
{
-
CEnumerationPtr ptrTriggerSel = cameraNodeMap.GetNode (
"TriggerSelector");
-
ptrTriggerSel->FromString(
"FrameStart");
-
CEnumerationPtr ptrTrigger = cameraNodeMap.GetNode (
"TriggerMode");
-
ptrTrigger->SetIntValue(
1);
-
CEnumerationPtr ptrTriggerSource = cameraNodeMap.GetNode (
"TriggerSource");
-
ptrTriggerSource->FromString(
"Line1");
-
}
-
else
if(index ==
2)
-
{
-
const CFloatPtr exposureTime = cameraNodeMap.GetNode(
"ExposureTimeAbs");
-
exposureTime->SetValue(theApp.m_iExposeTime);
-
}
-
else
if(index ==
3)
-
{
-
const CIntegerPtr cameraGen = cameraNodeMap.GetNode(
"GainRaw");
-
cameraGen->SetValue(theApp.m_iGain);
-
-
}
-
else
if(index ==
4)
-
{
-
const CBooleanPtr frameRate = cameraNodeMap.GetNode(
"AcquisitionFrameRateEnable");
-
frameRate->SetValue(TRUE);
-
const CFloatPtr frameRateABS = cameraNodeMap.GetNode(
"AcquisitionFrameRateAbs");
-
frameRateABS->SetValue(theApp.m_iHZ);
-
}
-
else
if(index ==
5)
-
{
-
const CIntegerPtr widthPic = cameraNodeMap.GetNode(
"Width");
-
widthPic->SetValue(theApp.m_Width);
-
}
-
else
if(index ==
6)
-
{
-
const CIntegerPtr heightPic = cameraNodeMap.GetNode(
"Height");
-
heightPic->SetValue(theApp.m_Height);
-
}
-
else
if(index ==
7)
-
{
-
CEnumerationPtr ptrLineSource = cameraNodeMap.GetNode (
"LineSource");
-
ptrLineSource->SetIntValue(
2);
-
}