basler相机曝光时间,增益等参数设置

news/2024/11/8 16:34:33/

参考:http://blog.csdn.net/liyuanbhu/article/details/74841591

参考:http://blog.csdn.net/cocoasprite/article/details/60955012

一、

在设置相机参数之前,先要获取相机对象。Pylon::CTlFactory 具有一个 CreateDevice() 方法可以用来生成一个相机对象,并返回一个指向 IPylonDevice 的指针。下面的代码用来获取枚举出来的第一个相机对应的对象。

  1. Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
  2. DeviceInfoList_t lstDevices;
  3. TlFactory.EnumerateDevices( lstDevices );
  4. IPylonDevice * pDevice;
  5. if(!lstDevices.empty())
  6. {
  7. pDevice = TlFactory.CreateDevice(lstDevices[0]);
  8. }
上面的代码还可以简化为:

  1. Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
  2. IPylonDevice * pDevice = TlFactory.CreateFirstDevice();
上面 CreateFirstDevice 函数是用来生成枚举到的第一个相机的接口。我们知道传输层还分 GigE、USB等许多中,如果我们希望直接生成 GigE 接口的第一个相机接口,可以先获得GigE 传输层的接口,然后调用接口中的CreateFirstDevice函数,具体可以参考下面的代码片段:

  1. Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
  2. Pylon::IGigETransportLayer* pTl = static_cast<Pylon::IGigETransportLayer*> (TlFactory.CreateTl("BaslerGigE"));
  3. IPylonDevice * pDevice = pTl->CreateFirstDevice();
上一篇博客介绍了相机的参数是用 GenApi Node Maps 数据结构来体现的。这个 Node Maps 的接口类型为 GenApi::INodeMap,可以通过 IPylonDevice 的 GetTLNodeMap() 函数和 GetNodeMap() 函数来获得。顾名思义 GetTLNodeMap() 是用来获得传输层参数的,GetNodeMap() 对应的是相机本身的参数。下面是代码示例。

  1. Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
  2. IPylonDevice * pDevice = TlFactory.CreateFirstDevice();
  3. GenApi::INodeMap* NodeMap = pDevice->GetNodeMap();
  4. 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” 这个参量的范围,并且将这个参量的值设为最大最小值的平均值。那我们的代码可以这样写:

  1. Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
  2. IPylonDevice * pDevice = TlFactory.CreateFirstDevice();
  3. GenApi::INodeMap* NodeMap = pDevice->GetNodeMap();
  4. GenApi::INode *pNode = pNodeMap->GetNode("Gain");
  5. GenApi::CFloatPtr gain(pNode);
  6. float gainMin = gain->GetMin();
  7. float gainMax = gain->GetMax();
  8. qDebug() << "current gain = " << gain->GetValue();
  9. gain->SetValue(gainMin + (gainMax - gainMin) / 2.0);
这里我们要注意几个地方,首先如果我们的相机不支持 Gain 这个参数,那么 pNode 将是空指针。后面的操作就会报错。第二,Gain 这个参数不一定可读可写,如果不可读 gain->GetMin() 就会报错。如果不可写,那么 gain->SetValue() 就会报错。所以我们应该用 GenApi::IsReadable() 和 GenApi::IsWritable() 来测试这个 INode 接口是否可以读写。另外还有一点需要特别注意,相机的参数都是在相机被打开后才可以读写的。如果我们知道相机是哪个传输层的,还可以有更简单的访问方式。比如我们的相机是 GigE 接口的,那么可以从 pDevice 构造一个 CBaslerGigEInstantCamera 对象,然后通过这个对象访问相机的各个属性。比如下面的代码:

  1. Pylon::CTlFactory& TlFactory = CTlFactory::GetInstance();
  2. Pylon::IGigETransportLayer* pTl = static_cast<Pylon::IGigETransportLayer*> (TlFactory.CreateTl("BaslerGigE"));
  3. IPylonDevice * pDevice = pTl->CreateFirstDevice();
  4. CBaslerGigEInstantCamera camera(pDevice);
  5. camera.Open();
  6. qDebug() << GenApi::IsReadable(camera.GainRaw);
  7. qDebug() << "GainRaw = " << camera.GainRaw.GetValue();
  8. qDebug() << "GainRaw.GetMax() = " << camera.GainRaw.GetMax();
  9. qDebug() << GenApi::IsWritable(camera.GainRaw);
  10. camera.GainRaw = camera.GainRaw.GetMax();
  11. camera.GainRaw.SetValue(camera.GainRaw.GetMin());
  12. camera.Close();
二、具体例子

  1. /*index = 0//设置相机的内触发
  2. = 1//设置相机的外触发
  3. = 2//设置相机的曝光时间
  4. = 3//设置相机的增益
  5. = 4//相机的频率
  6. = 5//图片的宽度
  7. = 6//图片的高度
  8. = 7//灯的触发信号
  9. */
  10. static void SetupCamera( Pylon::CInstantCamera& camera, int index)
  11. {
  12. int i = 0;
  13. try
  14. {
  15. using namespace GenApi;
  16. INodeMap &cameraNodeMap = camera.GetNodeMap();
  17. if(index == 0)
  18. {
  19. CEnumerationPtr ptrTriggerSel = cameraNodeMap.GetNode ("TriggerSelector");
  20. ptrTriggerSel->FromString("FrameStart");
  21. CEnumerationPtr ptrTrigger = cameraNodeMap.GetNode ("TriggerMode");
  22. ptrTrigger->SetIntValue(0);
  23. }
  24. else if(index == 1)
  25. {
  26. CEnumerationPtr ptrTriggerSel = cameraNodeMap.GetNode ("TriggerSelector");
  27. ptrTriggerSel->FromString("FrameStart");
  28. CEnumerationPtr ptrTrigger = cameraNodeMap.GetNode ("TriggerMode");
  29. ptrTrigger->SetIntValue(1);
  30. CEnumerationPtr ptrTriggerSource = cameraNodeMap.GetNode ("TriggerSource");
  31. ptrTriggerSource->FromString("Line1");
  32. }
  33. else if(index == 2)
  34. {
  35. const CFloatPtr exposureTime = cameraNodeMap.GetNode("ExposureTimeAbs");
  36. exposureTime->SetValue(theApp.m_iExposeTime);
  37. }
  38. else if(index == 3)
  39. {
  40. const CIntegerPtr cameraGen = cameraNodeMap.GetNode("GainRaw");
  41. cameraGen->SetValue(theApp.m_iGain);
  42. }
  43. else if(index == 4)
  44. {
  45. const CBooleanPtr frameRate = cameraNodeMap.GetNode("AcquisitionFrameRateEnable");
  46. frameRate->SetValue(TRUE);
  47. const CFloatPtr frameRateABS = cameraNodeMap.GetNode("AcquisitionFrameRateAbs");
  48. frameRateABS->SetValue(theApp.m_iHZ);
  49. }
  50. else if(index == 5)
  51. {
  52. const CIntegerPtr widthPic = cameraNodeMap.GetNode("Width");
  53. widthPic->SetValue(theApp.m_Width);
  54. }
  55. else if(index == 6)
  56. {
  57. const CIntegerPtr heightPic = cameraNodeMap.GetNode("Height");
  58. heightPic->SetValue(theApp.m_Height);
  59. }
  60. else if(index == 7)
  61. {
  62. CEnumerationPtr ptrLineSource = cameraNodeMap.GetNode ("LineSource");
  63. ptrLineSource->SetIntValue(2);
  64. }

http://www.ppmy.cn/news/538771.html

相关文章

帧率和曝光时间

像素频率&#xff1a; 1pixel 1clock 1/fp 行周期&#xff1a; 1 Horizontal Time 1clock * n (1行像素点数量) 列周期&#xff1a; 1 Vertical Time 1clock * n (1列像素点数量) 帧周期 曝光时间 读图时间(整帧像素点读出来) 帧率 减小&#x…

gc0329曝光时间设置

GC0329 -------------- row time (window_widthh_blanksh_delay4)*2*Tpclk window_width由0x0f,0x10寄存器控制&#xff0c;h_blank由0x05,0x06寄存器控制。sh_delay由0x11寄存器控制&#xff0c;目前常规设置为42,不需要修改。 比如window_width648&#xff0c;h_blank106,sh…

Hi3516EV200设置手动曝光时间

目录 0.测试环境说明1.手动曝光时间的设置2.曝光参数设置位置3.曝光时间的获取 0.测试环境说明 环境参数海思芯片型号Hi3516EV200传感器型号IMX307MPPMPP4.0SDKHi3516EV200_SDK_V1.0.1.1 1.手动曝光时间的设置 对手动曝光的控制接口函数为 HI_MPI_ISP_SetExposureAttr 和 HI_…

MATLAB固定工业相机曝光时间和增益系数

MATLAB固定工业相机曝光时间和增益系数 为什么写这篇博文&#xff1f;正文 为什么写这篇博文&#xff1f; 两个原因。 Matlab可以控制工业相机很多参数。但是&#xff0c;网络上关于其参数的配置文章较少&#xff0c;更多出现在论坛之中。这是其一。 在做光学实验时候&#xf…

相机曝光时间与增益

曝光和增益的一些基本概念 曝光时间&#xff1a;快门速度&#xff0c;简单来讲就是按下快门的时间&#xff0c;时间越长&#xff0c;光子到CCD\CMOS表面的光子总和越多&#xff0c;采集的图像就会越亮&#xff1b;如果曝光过度,则照片过亮,失去图像细节;如果曝光不足,则照片过暗…

RecycleView的Item曝光事件、曝光时间、阅读进度上报

2020-10-22 更新 在日常使用过程中&#xff0c;发现在onScroll中进行上报会大大增加滑动时的性能消耗&#xff08;由于在onScroll在滑动时过于频繁&#xff0c;而每次findFirstVisibleItemPosition都从0开始遍历一次子元素直至显示的view&#xff09;。因此建议把上报的起始位…

matlab 工业相机 曝光时间_工业相机的曝光、曝光时间、快门、增益

这几个概念在网上资料比较少,讲得都比较模糊。 勇哥先上一张图,后面再介绍具体的概念。 什么是曝光? 尽管摄影自诞生以来,无数人都在探索相机这个工具究竟能发挥那些作用。但一个最基本的作用,就是把我们眼睛看到的通过摄影来记录下来。 我们的人眼其实和拥有测光系统的照…

matlab 工业相机 曝光时间_相机帧率和曝光时间的关系

Exposure and Sensor Readout 相机上的图像采集过程包括两个截然不同的部分。第一部分是曝光。曝光完成后,进行第二部分Readout过程即从传感器的寄存器中读出数据并传送出去(Readout过程)。 关于图像采集过程中,相机操作有两种常见的方法:“non-overlapped”的曝光和“overl…