Qt之设置BASLER相机参数

一、背景知识

在设置相机参数之前,先要获取相机对象。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]);
    }

上面的代码还可以简化为:

    Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
    IPylonDevice * pDevice = TlFactory.CreateFirstDevice();

上面 CreateFirstDevice 函数是用来生成枚举到的第一个相机的接口。我们知道传输层还分 GigE、USB等许多中,如果我们希望直接生成 GigE 接口的第一个相机接口,可以先获得GigE 传输层的接口,然后调用接口中的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() 对应的是相机本身的参数。下面是代码示例。

    Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
    IPylonDevice * pDevice = TlFactory.CreateFirstDevice();
    GenApi::INodeMap* NodeMap = pDevice->GetNodeMap();
    GenApi::INodeMap* TLNodeMap = pDevice->GetTLNodeMap();

那么一个相机都有哪些参数,这些参数的名称是什么呢?这就需要参考 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::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);  
} 
要在Qt打开Basler相机,首先需要确保已经安装了相机驱动程序和Basler相机的相关SDK。接下来,可以按照以下步骤进行操作: 1. 在Qt创建一个新的项目,并在项目文件添加Basler相机的库文件和头文件的路径。 2. 在Qt的源代码文件包含Basler相机的头文件,例如`#include <pylon/PylonIncludes.h>`。 3. 在代码创建一个Pylon::CInstantCamera类的实例,这将代表相机对象。例如:`Pylon::CInstantCamera camera;` 4. 使用Basler相机的函数进行相机的初始化和打开。例如: ``` camera.Attach(Pylon::CTlFactory::GetInstance().CreateFirstDevice()); camera.Open(); ``` 5. 可以通过设置不同的相机参数来对相机进行配置,如曝光时间、帧率等。例如: ``` camera.ExposureTime.SetValue(10000); camera.AcquisitionFrameRateEnable.SetValue(true); camera.AcquisitionFrameRate.SetValue(30); ``` 6. 使用Qt的图形界面库来显示相机的实时图像。可以通过绑定相机的回调函数来获取相机的每一帧图像数据。例如: ``` camera.RegisterImageEventHandler(new Pylon::CImageEventHandler(), Pylon::RegistrationMode_Append, Pylon::Cleanup_Delete); camera.StartGrabbing(Pylon::GrabStrategy_LatestImageOnly); ``` 该回调函数将在每次获取图像时被触发,可在其处理图像数据。 7. 最后,当程序要关闭或退出时,确保释放相机资源,例如: ``` camera.StopGrabbing(); camera.Close(); ``` 这样,我们就可以在Qt成功打开和操作Basler相机
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宗而研之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值