Spinnaker 节点

下载 PDF - Spinnaker-Nodes

使用准备

使用摄像头前,建议您先了解下载页面提供的以下资源:

  • 摄像头入门指南 - 提供有关安装运行摄像头所需的组件和软件的信息。
  • 摄像头技术参考 — 提供有关摄像头的规格、功能和操作以及成像和采集控件的信息。
  • 固件更新 - 确保您使用全新版本的摄像头固件,以利用相关功能改进和漏洞修复。
  • Tech Insights - 订阅月度电子邮件更新,其中包含有关新知识库文章、新固件和软件发布,以及产品变更通知 (PCN) 的信息。

什么是 Spinnaker API?

Spinnaker API 基于 GenICam 标准而构建,可为各种摄像头和接口提供通用编程接口。 Spinnaker 是 GenAPI 的延伸。 Spinnaker 可提供快速、轻松地访问摄像头的方法。

Spinnaker API 包含两个主要组件。

图像采集—这是负责设置图像缓冲器和图像抓取的采集引擎。

摄像头配置—这是负责控制摄像头的配置引擎。 此组件由 QuickSpin API 组成,此封装使 GenAPI 易于使用。

节点

每个符合 GenICam 标准的摄像头都有一个 XML 描述文件。 该 XML 文件用于描述摄像头寄存器、寄存器的相互依赖性,以及通过低级寄存器的读写操作访问高级特性所需的其他所有信息。 这些特性包括增益、曝光时间、图像格式等。 摄像头描述文件的元素以软件对象(称为节点)表示。 节点图是指在运行时动态创建的节点的列表。

SpinView 中“特性”选项卡上描述的所有特性和功能都代表节点。

节点类型

大多数节点属于 7 种类型。 它们是:

类型 说明 示例
枚举 任何具有一系列可用文本条目的功能 Auto Gain 或 Acquisition Mode
EnumEntry 枚举功能中的单个条目 连续、一次、关闭或
连续、多帧、单帧
Command 任何需要命令才能执行的功能,通常由 SpinView 中的执行按钮表示 Timestamp Latch 或 Trigger Software
Float 任何拥有可能包含小数点的数字条目的功能 Gain 或 Exposure Time
Boolean 任何作为开关的功能,通常由 SpinView 中的复选框表示 ReverseX 或 Acquisition Frame Rate Enable
Integer 任何拥有数字条目(无小数点)的功能 Width 或 Height
String 任何拥有用户定义或静态文本条目的功能 Vendor Name(静态)或 Device User ID(用户定义)

确定节点类型和名称的方法

有数种方法可以确定某功能的节点类型以及在 API 中的确切节点名称。 一种方法是查看 Spinnaker SDK 附带的 Spinnaker API 文档,因为此文档包含所有 Spinnaker 兼容摄像头当前可用节点的完整列表。 然而,此文档还可能包含特定摄像头不支持的某些节点/条目。

另一种方法是使用 SpinView。 它仅列出摄像头支持的节点,并提供包含各节点详细信息的“node information”(节点信息)窗口。

如需访问节点信息窗口:

  1. 打开 SpinView 并选择摄像头。
  2. 在“Features”(功能)选项卡上,双击任意节点。 以下示例中,已选中“Acquisition Mode”(采集模式)。

Name 显示 Spinnaker API 内所用节点的实际名称。 Type 显示节点类型。 由于这是枚举类型,Symbolics 部分显示此节点的 EnumEntry 名称。

“Node Information”(节点信息)窗口包含其他信息,这些信息在访问或修改节点值时十分有用。

Description:提供节点用途的详细信息。

IsAvailable、IsReadable、IsWriteable:可用于访问节点之前检查节点是否可用、可读或可写。

Min/Max:这些定义了数值节点的最小值和最大值,无论是整数还是浮点。

Unit:显示特性的真实单位。

Value:显示当前的值。

访问 API 中的节点

Spinnaker 支持多种编程语言。 无论使用何种编程语言,均应用相同的节点设置。 下面的代码片段展示了如何在三种支持的编程语言环境中访问不同的节点类型:C++、C#、C 和 Python。

注意:以下代码片段不能实现可用性、可读性或可写性检查。 查看包含在 Spinnaker SDK 中的示例代码,了解如何执行此操作的详情。

Enumeration 和 EnumEntry 节点

下面的代码片段显示了如何访问 Enumeration 和 EnumEntry 节点。

Spinnaker
C++ API

// Enumeration node
CEnumerationPtr ptrGainAuto = pCam->GetNodeMap().GetNode("GainAuto");

//EnumEntry node(始终与 Enumeration 节点关联)
CEnumEntryPtr ptrGainAutoOff = ptrGainAuto->GetEntryByName("Off");

//Turn off Auto Gain
ptrGainAuto->SetIntValue(ptrGainAutoOff->GetValue());

Spinnaker
C# API

// Enumeration node
IEnum iGainAuto = nodeMap.GetNode("GainAuto");

//EnumEntry node(始终与 Enumeration 节点相关联)
IEnumEntry iGainAutoOff = iGainAuto.GetEntryByName("Off");

//Turn off Auto Gain
iGainAuto.Value = iGainAutoOff.Symbolic;

Spinnaker
C API

spinNodeHandle hGainAuto = NULL;
spinNodeHandle hGainAutoOff = NULL;
int64_t GainAutoOff = 0;

// Retrieve node(本例中为 Enumeration 节点)
spinNodeMapGetNode(hNodeMap,"GainAuto", &hGainAuto);

//EnumEntry node(始终与 Enumeration 节点相关联)
spinEnumerationGetEntryByName(hGainAuto, "Off", &hGainAutoOff);

//Turn off Auto Gain
spinEnumerationEntryGetIntValue(hGainAutoOff, &GainAutoOff);
spinEnumerationSetIntValue(hGainAuto, GainAutoOff);

Spinnaker
Python API

# Retrieve node (本例中为 Enumeration 节点)

node_gainauto_mode = PySpin.CEnumerationPtr(nodemap.GetNode("GainAuto"))

# EnumEntry node(始终与 Enumeration 节点相关联)
node_gainauto_mode_off = node_gainauto_mode.GetEntryByName("Off")

# Turn off Auto Gain
node_gainauto_mode.SetIntValue(node_gainauto_mode_off.GetValue())

Command 节点

下面的代码片段显示了如何访问 Command 节点。

Spinnaker
C++ API

// Command node
CCommandPtr ptrTimestampLatch = pCam->GetNodeMap().GetNode("TimestampLatch");

//Execute command
ptrTimestampLatch->Execute();

Spinnaker
C# API

// Command node
ICommand iTimestampLatch = nodeMap.GetNode("TimestampLatch");

//Execute command
iTimestampLatch.Execute();

Spinnaker
C API

// Retrieve node (command)
spinNodeMapGetNode(hNodeMap,"TimestampLatch", &hTimestampLatch);

//Execute command
spinCommandExecute(hTimestampLatch);

Spinnaker
Python API

# Retrieve node (command)
node_iTimestampLatch_cmd = PySpin.CCommandPtr(nodemap.GetNode("TimestampLatch"))

# Execute command
node_iTimestampLatch_cmd.Execute()

Float 节点

下面的代码片段显示了如何访问 Float 节点。

Spinnaker
C++ API

// Float node
CFloatPtr ptrGain = pCam->GetNodeMap().GetNode("Gain");

//Set gain to 0.6 dB
ptrGain->SetValue(0.6);

Spinnaker
C# API

// Float node
IFloat iGain = nodeMap.GetNode("Gain");

//Set gain to 0.6 dB
iGain.Value = 0.6;

Spinnaker
C API

spinNodeHandle hGain = NULL;

// Retrieve node (float)
spinNodeMapGetNode(hNodeMap,"Gain", &hGain);

//Set gain to 0.6 dB
spinFloatSetValue(hGain, 0.6);

Spinnaker
Python API

# Retrieve node (float)

node_iGain_float = PySpin.CFloatPtr(nodemap.GetNode("Gain"))

# Set gain to 0.6 dB
node_iGain_float.SetValue(0.6)

Boolean 节点

下面的代码片段显示了如何访问 Boolean 节点。

Spinnaker
C++ API

// Boolean node
CBooleanPtr ptrReverseX = pCam->GetNodeMap().GetNode("ReverseX");

//Set value to true(镜像图像)
ptrReverseX->SetValue(true);

Spinnaker
C# API

// Boolean node
IFloat iReverseX = nodeMap.GetNode("ReverseX");

//Set value to true(镜像图像)
iReverseX.Value = true;

Spinnaker
C API

spinNodeHandle hReverseX = NULL;

// Retrieve node (boolean)
spinNodeMapGetNode(hNodeMap,"ReverseX", &hReverseX);

//Set value to true(镜像图像)
spinBooleanSetValue(hReverseX, True);

Spinnaker
Python API

# Retrieve node (boolean)

node_iReverseX_bool = PySpin.CBooleanPtr(nodemap.GetNode("ReverseX"))

# Set value to true(镜像图像)
node_iReverseX_bool.SetValue(True)

Integer 节点

下面的代码片段显示了如何访问 Integer 节点。

Spinnaker
C++ API

// Integer node
CIntegerPtr ptrWidth = pCam->GetNodeMap().GetNode("Width");

//Set width of 640 pixels
ptrWidth->SetValue(640);

Spinnaker
C# API

// Integer node
IInteger iWidth = nodeMap.GetNode("Width");

//Set width of 640 pixels
iWidth.Value = 640;

Spinnaker
C API

// Retrieve node (integer)
spinNodeMapGetNode(hNodeMap,"Width", &hWidth);

//Set width of 640 pixels
spinIntegerSetValue(hWidth, 640);

Spinnaker
Python API

# Retrieve node (integer)
node_iWidth_int = PySpin.CIntegerPtr(nodemap.GetNode("Width"))

# Set width of 640 pixels
node_iWidth_int.SetValue(640)

String 节点

下面的代码片段显示了如何访问 String 节点。

Spinnaker
C++ API

// String node
CStringPtr ptrVendorName = pCam->GetNodeMap().GetNode("DeviceVendorName");

//Display vendor name
cout <>< "VendorName: " <>< ptrVendorName->GetValue() <>< endl;</></></>

Spinnaker
C# API

// String node
IString iVendorName = nodeMap.GetNode("DeviceVendorName");

//Display vendor name
Console.WriteLine("VendorName: {0}", iVendorName.Value);

Spinnaker
C API

spinNodeHandle hVendorName = NULL;
char vendorName[MAX_BUFF_LEN];
size_t lenVendorName = MAX_BUFF_LEN;

// Retrieve node (string)
spinNodeMapGetNode(hNodeMap,"DeviceVendorName", &hVendorName);

// Display vendor name
spinStringGetValue(hVendorName, vendorName, &lenVendorName);
printf("Vendor name: %s \n", vendorName);

Spinnaker
Python API

# Retrieve node (string)

node_iVendorName_str = PySpin.CStringPtr(nodemap.GetNode("DeviceVendorName"))

# Display vendor name
print("VendorName: %s" % (node_iVendorName_str.GetValue()))

故障排除

不确定特定功能或节点的工作方式,以及如何与其进行交互

Spinnaker SDK 附带的示例代码包含各种各样的节点及其功能。

无法进行更改或访问节点

您可能正在尝试访问当前被锁定的功能。 如需了解功能锁定的详情,请参见技术应用说明 Spinnaker API 中的功能锁定。