擷取與處理影像#
Smart Blaze 攝影機上的影像擷取與處理方式,與任何 x86 架構的Linux 主機電腦完全相同。這得益於虛擬機器與攝影機之間的虛擬網路連線,因此無論軟體是在主機上運行,還是運行於 Smart Blaze 上的虛擬機器中,其控制方式或影像擷取過程均無差異。
對於在 Smart Blaze 上的虛擬機器(VM)內執行的軟體,目前支援 C++ 以及搭配 pypylon 的 Python。pylon 的 C# 綁定目前尚未在 Smart Blaze 攝影機上進行測試。
這種一致的運作方式是透過在虛擬機器與攝影機之間建立虛擬網路連線來實現的,因此無論軟體是在主機上執行,還是執行於 Smart Blaze 上的虛擬機器中,其控制方式或影像擷取皆無差異。
文件與範例#
有關配置 blaze 攝影機及設定擷取迴圈的說明,請參閱《blaze 程式設計師指南》。在開發電腦上安裝 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 以及 blaze 的補充套件。
CPU 資源管理#
Smart Blaze 攝影機(4 顆 1.5 GHz Cortex-A53 處理器)可用的 CPU 資源,由原生攝影機韌體與客戶端虛擬機器共同共用。為確保穩定的影像擷取與深度處理,攝影機韌體以即時優先級運行,而客戶端虛擬機器則以一般任務優先級運行。
此設計使虛擬機器中的軟體能夠充分利用所有四個虛擬 CPU 核心,同時不影響影像擷取或深度運算。虛擬 CPU 核心僅被分配當前未用於影像擷取及深度處理的實體核心比例。
在影像擷取進行期間,相機韌體會使用三個實體核心。當韌體完成一幀影像的擷取與處理後,會出現一段時間窗口,在此期間虛擬機器幾乎可以獨佔使用這些 CPU 核心。當觸發下一幀影像擷取時,此時間窗口即告結束。目前,此時間窗口中有約 20 毫秒用於透過虛擬網路在韌體與虛擬機器之間傳輸影像資料,這佔用了其中一個核心的相當大一部分資源。 預期未來的優化措施將使此傳輸速度更快,並降低對系統資源的消耗。
X11 轉發會增加額外的延遲,這可能會減慢您的擷取迴圈速度,並導致畫面丟失。
當您的應用程式無法跟上處理速度,並開始出現掉幀現象時,請考慮降低幀率。
控制幀率#
您可以透過主電腦上的3D 檢視器手動控制幀率(請注意,這些設定在相機重新開機後將不會保留),或者在您的應用程式中設定相關的相機參數來控制幀率。
有幾種方法可以觸發相機的畫面擷取:
- 硬體觸發:相機僅在接收到硬體觸發訊號時,才會擷取一幀畫面。
- 軟體觸發:相機僅在接收到來自應用程式的軟體觸發訊號時,才會擷取一幀畫面。
- 自由運行:相機透過內建的週期性觸發器持續擷取影像幀。自由運行是預設的觸發模式。
若要啟用或停用幀率控制,請使用 AcquisitionFrameRateEnable 參數。啟用後,您可以設定 AcquisitionFrameRate 此參數用於指定所需的幀率(以每秒幀數 [fps] 為單位)。在自由運行模式下,攝影機會自動調整其內部時序,以達到所要求的幀率。
在觸發模式下,幀率設定決定了觸發訊號允許的最大頻率。若觸發訊號傳入過快,那些發生在最小間隔之前的時間點所產生的觸發訊號將被忽略。
使用軟體觸發器時,您可以檢查 AcquisitionStatus 用於判斷相機是否已準備好接收下一次觸發訊號的參數。
一種穩健的做法是使用軟體觸發機制,確保僅在應用程式準備好處理下一幀時才啟動擷取。這樣一來,虛擬機器中的應用程式便能在請求下一幀之前,將所有可用的 CPU 資源用於處理作業。
使用軟體觸發的意涵
軟體觸發方式通常會導致幀率低於最大可能值,因為在處理完一幀並觸發下一幀後,應用程式必須等待曝光、深度計算以及將資料傳輸至虛擬機(VM)的過程完成。
溫度如何影響精確度#
深度資料的準確性取決於能否維持恆定的運作溫度。觸發頻率的波動可能會導致溫度波動,進而影響深度準確性。
為防止這種情況發生,該 TriggerThermalDriftStabilization 此參數預設為啟用狀態。當在軟體或硬體觸發模式下啟用此參數時,相機韌體會以恆定幀率在背景中持續擷取並處理影像,並在接收到觸發訊號時傳送當前或下一張可用的影像。
由於背景處理會消耗 CPU 資源,因此在軟體觸發模式下,您應減少 AcquisitionFrameRate 設定或停用 TriggerThermalDriftStabilization 參數中選擇性地指定 HTML 記錄檔 (*.html) 的路徑與檔名。
在同一網路中使用多台 Blaze 攝影機#
當在同一個網路中使用多台 Blaze 攝影機(Smart Blaze 或 Blaze)時,進行攝影機清點時,除了會找到應用程式正在運行的那台 Smart Blaze 攝影機外,也可能找到其他可連線的 Blaze 攝影機。應用程式正在運行的那台 Smart Blaze 攝影機稱為「主攝影機」。
資訊
若在呼叫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 韌體#
某些使用情境可能需要從虛擬機器內部更新 Smart Blaze 攝影機的韌體。可透過存取連接至埠號的軟體更新網頁/REST 介面來執行此操作 <cameraip>:8080 從虛擬機器內部,並上傳一個合適的 *.swu 由 Basler 提供的檔案。
資訊
更新成功後,攝影機(包括正在運行的虛擬機器)會自動重新啟動。因此,虛擬機器內的程序應具備足夠的穩健性,以應對在完成.swu檔案上傳後被強制中斷的情況。
要驗證韌體更新是否成功,請將從GenICam 寄存器取得的當前韌體版本進行比對 DeviceFirmwareVersion 並附上預期的韌體版本。為簡化操作,當前的韌體版本也會透過核心命令列傳入虛擬機器,並使用 blazeFirmwareVersion 參數:
輸出範例: