跳转到内容

相机模拟#

相机模拟功能使您无需连接物理相机设备即可测试相机的基本功能,并创建测试图像。

可以使用 pylon API 和 pylon Viewer 访问仿真相机设备。

概述#

除了 GigE Vision 或 USB3 Vision 之类的相机传输层之外,pylon 还提供了可创建简单仿真相机设备的传输层。这使您无需物理相机即可开发应用。如果您要开发多相机应用,并且手头没有足够的相机,这也非常有用。

您最多可以创建 256 个仿真相机设备。

除了模拟图像采集和标准相机功能之外,仿真相机设备还提供物理相机不具备的功能:

启用相机模拟#

您可以在 pylon Viewer 和/或 pylon API 中启用相机模拟。

安装相机模拟支持#

  • 如果您正在使用 pylon Linux 版,默认情况下会安装相机模拟支持。
  • 如果您正在使用 pylon Windows 版并已通过运行时可再发行软件包安装 pylon,默认情况下会安装相机模拟支持。
  • 如果您正在使用 pylon Windows 版并已通过 pylon Camera Software Suite 安装程序安装 pylon:
    • 如果在安装过程中选择了相机用户开发人员配置文件,则默认情况下会安装相机模拟支持。
    • 如果在安装过程中选择了自定义配置文件,则只有在选择了相机模拟支持选项后,才会安装相机模拟支持。如果尚未选择此选项,请再次运行安装程序并选择该选项。

在 pylon Viewer 中启用相机模拟#

在 pylon Viewer 中启用相机模拟:

  1. 确保已安装相机模拟支持。
  2. 在 pylon Viewer 的工具菜单中,单击选项
  3. 选项对话框中,单击相机模拟
  4. 相机模拟页面上,输入所需仿真相机设备数量,然后单击确定
    短暂等待后,模拟设备将显示在设备窗格中。
    可以使用 pylon Viewer 访问这些设备。如果您还想访问 pylon API,请按照以下说明进行操作。

信息

如果将仿真相机设备的数量设置为 0,则相机模拟节点将不会显示在设备窗格中。

在 pylon API 中启用相机模拟#

在 pylon API 中启用相机模拟:

  1. 确保已安装相机模拟支持。
  2. 添加一个名为 PYLON_CAMEMU系统环境变量,并将其值设置为所需的模拟设备数。
    示例: PYLON_CAMEMU=2
    这将提供两个模拟设备。
    可以使用 pylon API 访问这些设备。如果您还想使用 pylon Viewer 访问它们,请按照上述说明进行操作。

信息

如果 PYLON_CAMEMU 未设置或设置为 0,则没有可用的模拟设备。

标准相机功能#

仿真相机设备可以模拟以下标准相机功能:

附加功能#

以下功能在仿真相机设备上可用,而在物理 Basler 相机上可用。

显示自定义测试图像#

除了显示标准测试图像之外,相机模拟还允许您显示从硬盘加载的自定义测试图像。

信息

  • Windows 上,可以加载以下图像文件格式:BMP、JPG、PNG 和 TIF。
  • Linux 上,可以加载以下图像文件格式:PNG 和 TIF。

要显示自定义测试图像:

  1. TestImageSelector 参数设置为 Off
    这将禁用标准测试图像。
  2. ImageFileMode 参数设置为 On
    这将启用自定义测试图像。
  3. 如果要显示单个测试图像,请在 ImageFilename 参数中提供图像文件名,包括完整路径。
    示例:c:\images\my-test-image.png
  4. 如果要显示 多个 测试图像:
    1. 将所有要显示的测试图像放在一个目录中。
      该目录不得包含任何子目录。
    2. Provide the full path of the directory containing the files in the ImageFilename parameter.
      Example: c:\images\
  5. 至少采集一张图像以显示测试图像。如果要在 pylon Viewer 中显示测图像,请单击工具栏中的“单拍”或“连拍”按钮。

故障排除

  • 如果未显示自定义测试图像,即显示的图像为全黑,则表示 pylon 无法加载文件。检查 ImageFilename 参数中提供的文件名或路径。如果提供了目录名称,请确保该目录不包含任何子目录。
  • 如果自定义测试图像以单色显示,请切换为彩色像素格式(BGR/BGRA/RGB)。
  • 如果自定义测试图片未以完整尺寸显示,请调整图片 ROI参数(WidthHeightOffsetXOffsetY)。

生成失败的缓冲区#

强制失败的缓冲区功能使您可以通过生成失败的缓冲区来模拟不良的相机连接。比如说,这对于测试您的异常处理例程很有用。

要生成失败缓冲区:

  1. 开始图像采集。
  2. ForceFailedBufferCount 参数设置为要生成的失败缓冲区的数量。
  3. 执行 ForceFailedBuffer 命令。
    仿真相机设备现在将生成损坏的图像。损坏图像的数量取决于 ForceFailedBufferCount 参数的值。

示例代码#

// ** Custom Test Images **
// Disable standard test images
camera.TestImageSelector.SetValue(TestImageSelector_Off);
// Enable custom test images
camera.ImageFileMode.SetValue(ImageFileMode_Off);
// Load custom test image from disk
camera.ImageFilename.SetValue("c:\images\image1.png");
// ** Force Failed Buffer **
// Set the number of failed buffers to generate to 40
camera.ForceFailedBufferCount.SetValue(40);
// Generate 40 failed buffers
camera.ForceFailedBuffer.Execute();
INodeMap& nodemap = camera.GetNodeMap();
// ** Custom Test Images **
// Disable standard test images
CEnumerationPtr(nodemap.GetNode("TestImageSelector"))->FromString("Off");
// Enable custom test images
CEnumerationPtr(nodemap.GetNode("ImageFileMode"))->FromString("Off");
// Load custom test image from disk
CStringPtr(nodemap.GetNode("ImageFilename"))->SetValue("c:\images\image1.png");
// ** Force Failed Buffer **
// Set the number of failed buffers to generate to 40
CIntegerPtr(nodemap.GetNode("ForceFailedBufferCount"))->SetValue(40);
// Generate 40 failed buffers
CCommandPtr(nodemap.GetNode("ForceFailedBuffer"))->Execute();
INodeMap& nodemap = camera.GetNodeMap();
// ** Custom Test Images **
// Disable standard test images
CEnumParameter(nodemap, "TestImageSelector").SetValue("Off");
// Enable custom test images
CEnumParameter(nodemap, "ImageFileMode").SetValue("Off");
// Load custom test image from disk
CStringParameter(nodemap, "ImageFilename").SetValue("c:\images\image1.png");
// ** Force Failed Buffer **
// Set the number of failed buffers to generate to 40
CIntegerParameter(nodemap, "ForceFailedBufferCount").SetValue(40);
// Generate 40 failed buffers
CCommandParameter(nodemap, "ForceFailedBuffer").Execute();
// ** Custom Test Images **
// Disable standard test images
camera.Parameters[PLCamera.TestImageSelector].SetValue(PLCamera.TestImageSelector.Off);
// Enable custom test images
camera.Parameters[PLCamera.ImageFileMode].SetValue(PLCamera.ImageFileMode.Off);
// Load custom test image from disk
camera.Parameters[PLCamera.ImageFilename].SetValue("c:\images\image1.png");
// ** Force Failed Buffer **
// Set the number of failed buffers to generate to 40
camera.Parameters[PLCamera.ForceFailedBufferCount].SetValue(40);
// Generate 40 failed buffers
camera.Parameters[PLCamera.ForceFailedBuffer].Execute();
// ** Custom Test Images **
// Disable standard test images
Pylon.DeviceFeatureFromString(hdev, "TestImageSelector", "Off");
// Enable custom test images
Pylon.DeviceFeatureFromString(hdev, "ImageFileMode", "Off");
// Load custom test image from disk
Pylon.DeviceFeatureFromString(hdev, "ImageFilename", "c:\images\image1.png");
// ** Force Failed Buffer **
// Set the number of failed buffers to generate to 40
Pylon.DeviceSetIntegerFeature(hdev, "ForceFailedBufferCount", 40);
// Generate 40 failed buffers
Pylon.DeviceExecuteCommandFeature(hdev, "ForceFailedBuffer");
/* Macro to check for errors */
#define CHECK(errc) if (GENAPI_E_OK != errc) printErrorAndExit(errc)
GENAPIC_RESULT errRes = GENAPI_E_OK;  /* Return value of pylon methods */
/* ** Custom Test Images ** */
/* Disable standard test images */
errRes = PylonDeviceFeatureFromString(hdev, "TestImageSelector", "Off");
CHECK(errRes);
/* Enable custom test images */
errRes = PylonDeviceFeatureFromString(hdev, "ImageFileMode", "Off");
CHECK(errRes);
/* Load custom test image from disk */
errRes = PylonDeviceFeatureFromString(hdev, "ImageFilename", "c:\images\image1.png");
CHECK(errRes);
/* ** Force Failed Buffer ** */
/* Set the number of failed buffers to generate to 40 */
errRes = PylonDeviceSetIntegerFeature(hdev, "ForceFailedBufferCount", 40);
CHECK(errRes);
/* Generate 40 failed buffers */
errRes = PylonDeviceExecuteCommandFeature(hdev, "ForceFailedBuffer");
CHECK(errRes);

您也可以使用 pylon Viewer 轻松设置参数。