擷取與處理影像#
Smart blaze 相機上的影像擷取與處理方式,與任何 x86 Linux 主機電腦相同。VM 與相機之間建立的虛擬網路連線讓這成為可能,因此無論軟體是在主機上執行,還是在 Smart blaze 上的 VM 中執行,在控制或影像擷取上都沒有差別。
對於在 Smart blaze 上的 VM 中執行的軟體,目前支援 C++ 以及搭配 pypylon 的 Python。pypylon 的 C# 繫結尚未在 Smart blaze 相機上進行測試。
此一致的行為是透過在 VM 與相機之間建立虛擬網路連線來實現的,因此無論軟體是在主機上執行,還是在 Smart blaze 上的 VM 中執行,在控制或影像擷取上都沒有差別。
文件與範例#
有關設定 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 網站下載 Basler pylon 與 Supplementary Package for blaze。
管理 CPU 資源#
Smart blaze 相機上可用的 CPU 資源(4x Cortex-A53 於 1.5 GHz)在原生相機韌體與客戶 VM 之間共用。為了確保穩定擷取影像與進行深度處理,相機韌體以即時優先級執行,而客戶 VM 則以一般工作優先級執行。
此設計允許 VM 中的軟體充分利用所有四個虛擬 CPU 核心,而不會影響影像擷取或深度計算。分配給虛擬 CPU 核心的實體核心比例,僅限於目前影像擷取與深度處理不需要的部分。
在進行影像擷取時,相機韌體會使用三個實體核心。當韌體完成擷取與處理一個影格時,會有一段時間窗口,在此期間 VM 可以幾乎獨佔方式利用 CPU 核心。當觸發下一個影格擷取時,此窗口即告結束。目前,此窗口中約有 20 ms 用於透過韌體與 VM 之間的虛擬網路傳輸影像資料,佔用了其中一個核心的大部分資源。預期未來的最佳化能使此傳輸速度更快且耗用較少資源。
X11 轉發會引入額外的延遲,這可能會減慢您的擷取迴圈並導致遺失影格。
當您的應用程式無法跟上處理速度並開始遺失影格時,請考慮降低影格率。
控制影格率#
您可以使用主機電腦上的 3D Viewer 手動控制影格率(請注意,設定在相機重新開機後無法持續保留),或者透過在應用程式中設定相關相機參數來控制。
相機上有幾種觸發影像擷取的方法:
- Hardware trigger:唯有在相機收到硬體觸發訊號時,才會擷取影格。
- Software trigger:唯有在相機收到來自應用程式的軟體觸發訊號時,才會擷取影格。
- Free run:相機使用內部的週期性觸發持續擷取影格。Free run 是預設的 Trigger Mode。
若要啟用或停用影格率控制,請使用 AcquisitionFrameRateEnable 參數。啟用後,您可以設定 AcquisitionFrameRate 參數以指定所需的影格率(以每秒影格數 [fps] 為單位)。在 free run 模式下,相機自動調整其內部計時以達到要求的影格率。
在觸發模式下,影格率設定定義了觸發訊號允許的最大頻率。如果觸發訊號到達的速度過快,發生在最短間隔之前的觸發訊號將會被忽略。
當使用軟體觸發時,您可以檢查 AcquisitionStatus Property 來判斷相機是否準備好接受下一個觸發。
一個穩健的方法是使用軟體觸發,以便僅在應用程式準備好處理下一張畫面時才開始擷取。這可讓虛擬機器中的應用程式在請求下一張畫面之前,使用所有可用的 CPU 資源進行處理。
使用 Software Triggering 的影響
軟體觸發方法通常會導致低於最大可能值的幀率,因為在處理完一個影格並觸發下一個影格後,應用程式必須等待曝光、深度計算以及傳輸至 VM 的網路傳輸完成。
溫度如何影響準確度#
深度資料的準確度取決於維持恆定的工作溫度。觸發頻率的變化可能會導致溫度波動,進而影響深度準確度。
為了防止這種情況, TriggerThermalDriftStabilization 參數預設為啟用。當在 Trigger Mode 軟體或硬體模式下啟用時,相機韌體會在背景以恆定幀率持續擷取並處理影像,並在收到觸發時提供目前或下一個可用的影像。
由於背景處理會消耗 CPU 資源,在軟體觸發模式下,您應該降低 AcquisitionFrameRate 值或停用 TriggerThermalDriftStabilization 參數的值。
在同一網路中使用多部 blaze 相機#
當在同一網路中使用多部 blaze 相機(Smart blaze 或 blaze)時,相機列舉(enumeration)可能不僅會找到執行應用程式所在的 Smart blaze 相機,還會找到其他可連線的 blaze 相機。執行應用程式所在的 Smart blaze 相機稱為「主機相機(host camera)」。
資訊
在沒有序號篩選條件的情況下使用 CreateFirstDevice 不一定會開啟主機相機。
如果網路中存在多部相機,可以透過其序號來識別主機相機。序號會透過核心命令列傳遞至 VM。您可以透過執行下列命令來檢查:
輸出範例:
$ 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:
輸出範例: