跳转到内容
STAGING SERVER
DEVELOPMENT SERVER

采集与处理图像#

本主题介绍如何使用 Smart blaze 相机捕获和处理图像。

在 Smart blaze 相机上进行图像采集和处理的工作方式与在任何 x86 Linux 主机计算机上完全相同。虚拟机与相机之间建立的虚拟网络连接使这成为可能,因此无论软件是在主机上运行,还是在 Smart blaze 上的虚拟机中运行,在控制或图像采集方面都没有任何区别。

对于在 Smart blaze 虚拟机内部运行的软件,目前支持 C++ 和 Python(配合 pypylon)。pypylon 的 C# 绑定尚未在 Smart blaze 相机上经过测试。

这种一致的行为是通过在虚拟机与相机之间建立虚拟网络连接来实现的,因此无论软件是在主机上运行,还是在 Smart blaze 上的虚拟机中运行,在控制或图像采集方面都没有任何区别。

文档与示例#

有关配置 blaze 相机和设置采集循环的说明,请参考 blaze Programmer's Guide。在开发计算机上安装 Basler pylon 和 pylon Supplementary Package for blaze 后,您可以在安装目录中找到示例代码:

  • /opt/pylon/share/pylon/Samples/blaze/cpp/
  • /opt/pylon/share/pylon/Samples/blaze/Python/pypylon/

您可以从 Basler website 下载 Basler pylon 和 pylon Supplementary Package for blaze。

管理 CPU 资源#

Smart blaze 相机上可用的 CPU 资源(4 个 Cortex-A53,1.5 GHz)由本机相机固件和客户虚拟机共享。为了确保稳定的图像采集和深度处理,相机固件以实时优先级运行,而客户虚拟机以常规任务优先级运行。

这种设计允许虚拟机中的软件充分利用全部四个虚拟 CPU 核心,而不会影响图像采集或深度计算。分配给虚拟 CPU 核心的物理核心份额仅限于当前图像采集和深度处理不需要的部分。

在图像采集进行期间,相机固件使用三个物理核心。当固件完成一帧的采集和处理后,会有一段时间窗口,在此期间虚拟机可以几乎独占方式使用 CPU 核心。该窗口在触发下一帧采集时结束。目前,此窗口中大约有 20 ms 的时间用于在固件和虚拟机之间的虚拟网络上传输图像数据,占据了一个核心的很大一部分。预计未来的优化将使此传输更快且占用更少的资源。

X11 转发会引入额外的延迟,这可能会减慢您的采集循环并导致丢帧。

当您的应用程序无法跟上处理速度并开始丢帧时,请考虑降低帧率。

控制帧率#

您可以通过主机计算机上的 3D Viewer 手动控制帧率(请注意,设置在相机断电重启后不会保留),或者通过在应用程序中配置相关的相机参数来控制。

相机上有多种触发图像采集的方法:

  • Hardware trigger:相机仅在收到硬件触发信号时才采集一帧。
  • Software trigger:相机仅在收到来自应用程序的软件触发信号时才采集一帧。
  • Free run:相机使用内部周期性触发器连续采集帧。Free run 是默认的 Trigger Mode。

若要启用或禁用帧率控制,请使用 AcquisitionFrameRateEnable 参数。启用后,您可以设置 AcquisitionFrameRate 参数以指定所需的帧率(以每秒帧数 fps 为单位)。在 Free run 模式下,相机会自动调整其内部计时以实现请求的帧率。

在触发模式下,帧率设置定义了允许的触发信号的最大频率。如果触发信号到达过快,则那些出现在最小间隔之前的信号将被忽略。

使用软件触发时,您可以检查 AcquisitionStatus Property 以确定相机是否准备好接受下一个触发信号。

一种可靠的方法是使用软件触发,以便仅在应用程序准备好处理下一帧时才开始采集。这允许虚拟机中的应用程序在请求下一帧之前,使用所有可用的 CPU 资源进行处理。

使用软件触发的影响

由于在处理完一帧并触发下一帧之后,应用程序必须等待曝光、深度计算以及向 VM 的网络传输完成,因此软件触发方法通常会导致低于最大可能值的帧率。

温度如何影响精度#

深度数据的精度取决于维持恒定的工作温度。触发频率的变化会导致温度波动,从而影响深度精度。

为了防止这种情况,默认情况下会启用 TriggerThermalDriftStabilization 参数。在软件或硬件 Trigger Mode 下启用该参数时,相机会在后台以恒定帧率持续采集和处理图像,并在收到触发信号时交付当前或下一个可用的图像。

由于后台处理会消耗 CPU 资源,因此在软件 Trigger Mode 下,您应该减小 AcquisitionFrameRate 值或禁用 TriggerThermalDriftStabilization 参数。

在同一网络中使用多个 blaze 相机#

当在同一网络中使用多个 blaze 相机(Smart blaze 或 blaze)时,相机枚举可能不仅会找到应用程序正在其上运行的 Smart blaze 相机,还会找到其他可访问的 blaze 相机。应用程序正在其上运行的 Smart blaze 相机被称为“主机相机”。

信息

在没有序列号筛选器的情况下使用 CreateFirstDevice 不一定打开主机相机。

如果在网络中存在多台相机,可以通过其序列号来识别主机相机。序列号通过内核命令行传递给 VM。您可以通过运行以下命令进行检查:

cat /proc/cmdline

示例输出:

$ cat /proc/cmdline
root=/dev/vda1 rw console=ttyAMA0 earlycon rootwait ip=192.168.1.127:::255.255.255.0:::off:: blazeSerial=40560199 blazeFirmwareVersion=fw-6.0.0-20260428134100;fw-6.0.0+gf1b86064cda6
C++ 示例:通过序列号打开主机相机#
#include <regex>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <pylon/PylonIncludes.h>
#include <pylon/BlazeInstantCamera.h>

using namespace Pylon;
int main() {
    std::string serial_number = "40560199";
    std::string cmdline = (std::stringstream() << std::ifstream("/proc/cmdline").rdbuf()).str();
    std::smatch match;
    if (std::regex_search(cmdline, match, std::regex("blazeSerial=(\\d+)")))
        serial_number = match[1];
    PylonInitialize();
    CBlazeInstantCamera camera(CTlFactory::GetInstance().CreateFirstDevice(
        CDeviceInfo().SetDeviceClass(BaslerGenTlBlazeDeviceClass).SetSerialNumber(serial_number.c_str())));
    camera.RegisterConfiguration(new CBlazeDefaultConfiguration, RegistrationMode_ReplaceAll, Cleanup_Delete);
    camera.Open();
    std::cout << "Connected to camera " << camera.GetDeviceInfo().GetFriendlyName() << std::endl;
    std::cout << "Serial Number: " << camera.GetDeviceInfo().GetSerialNumber() << std::endl;
}
Python 示例:通过序列号打开主机相机#
rom pypylon import pylon
import re

serial_number = "40560199" # default
with open("/proc/cmdline") as f:
    match = re.search(r'blazeSerial=(\d+)', f.read())
    if match:
        serial_number = match.group(1)
factory = pylon.TlFactory.GetInstance()
device_info = pylon.DeviceInfo()
device_info.SetSerialNumber(serial_number)
camera = pylon.InstantCamera(factory.CreateDevice(device_info))
camera.Open()
print(f"Connected to camera {camera.GetDeviceInfo().GetFriendlyName()}")
print(f"Serial Number: {camera.GetDeviceInfo().GetSerialNumber()}")

管理 Smart blaze 固件#

某些用例可能要求从 VM 内部更新 Smart blaze 相机固件。这可以通过在 VM 内部访问端口 <cameraip>:8080 上的软件更新 Web/REST 接口并上传 Basler 提供的适用 *.swu 文件来实现。

信息

成功更新会自动重启相机,包括正在运行的 VM。因此,VM 内部的进程应具备鲁棒性,以便在完成上传 .swu 文件后能够被强行中断。

要验证固件更新是否成功,请将从 GenICam 寄存器 DeviceFirmwareVersion 获取的当前固件版本与预期固件版本进行比较。为简单起见,当前固件版本也会通过带有 blazeFirmwareVersion 参数的内核命令行传递到 VM 中:

cat /proc/cmdline

示例输出:

$ cat /proc/cmdline
root=/dev/vda1 rw console=ttyAMA0 earlycon rootwait ip=192.168.1.127:::255.255.255.0:::off:: blazeSerial=40560199 blazeFirmwareVersion=fw-6.0.0-20260428134100;fw-6.0.0+gf1b86064cda6