Pylon5 編程指南(C++)

開始使用

??pylon編程向導是關于如何使用Basler pylon c++ API進行編程的快速指南。它可以與pylon示例代碼一起使用。此外,API參考提供了有關Basler pylon c++接口的文檔。接口文檔也可以在pylon的頭文件中找到。當使用Microsoft Visual Studio時,右鍵所需的方法或類,并從上下文菜單中選擇“Go To Declaration”以轉到相關文檔。

使用pylon編譯應用程序的通用設置

??本節展示了用于使用pylon構建32位應用程序的最常見的Microsoft Visual Studio構建設置。有關更多信息,請參閱高級主題部分,例如,當需要不同的配置時

  • 添加庫文件
$(PYLON_DEV_DIR)\include;
  • 添加動態庫
$(PYLON_DEV_DIR)\lib\Win32;
  • 在Debug或者release項目配置中啟用運行類型信息(Configuration Properties -> C/C++ -> Language -> Enable Runtime Type Info).
yes
  • 在debug或者release中啟用C++異常信息
yes

使用Gige相機調試pylon應用程序

??在使用GigE相機調試pylon應用程序時,可能會遇到心跳超時。應用程序必須在規定的時間間隔內向相機發送專門的網絡數據包。如果相機沒有接收到這些心跳,它會認為連接已經斷開,不會接受應用程序的任何指令。這需要在調試時將相機的心跳超時設置為較高的值。

對pylon的運行庫進行初始化和反初始化

??pylon運行庫系統必須在使用前被初始化。基于pylon的應用程序必須在使用pylon運行庫系統的任何其他函數之前調用PylonInitialize()方法。在應用程序退出之前,它必須調用PylonTerminate()方法來釋放被pylon運行庫系統分配的資源。
??Pylon::PylonAutoInitTerm類可以有助于實現上述功能。PylonAutoInitTerm的構造函數調用PylonInitialize(),析構函數調用PylonTerminate()。這確保在PylonAutoInitTerm類型的對象的生存期內被初始化pylon運行庫系統。

#include <pylon/PylonIncludes.h>

using namespace Pylon;

int main(int argc, char* argv[])
{
Pylon::PylonAutoInitTerm;// PylonInitialize() will be called now
// Use pylon
// ..
} // autoInitTerm's destructor calls PylonTerminate() now

錯誤處理

??在出現錯誤的情況下,pylon類的可能會拋出c++異常。pylon c++ API拋出GenericException類型的異常或GenericException的子類異常。您應該使用捕獲GenericException的異常處理程序來保護pylon調用,例如:

try
{
  camera.Width.SetValue( 640 );
}
catch (const GenericException & e)
{
  cerr << "Failed to set the AOI width. Reason: "
  << e.GetDescription() << endl;
}

創建一個pylon設備

??在pylon中,物理相機設備由pylon Devices表示。下面的例子展示了如何創建一個pylon設備:

IPylonDevice* pDevice = CTlFactory::GetInstance().CreateFirstDevice();

??第一個發現的相機設備被創建,例如,一個視覺系統只使用一個相機。
*注:第一次創建相機時,相機的GenICam參數描述文件被處理。處理的結果存儲在磁盤上的緩存中。這就是為什么第一次創建要比隨后的創建花費更長的時間。如果創建是由使用調試器啟動的程序完成的,那么設備創建將花費相當長的時間。這是因為當調試器啟動程序時,Windows提供了一個特殊的debug堆,并且當使用debug堆時,處理參數描述文件會導致大量的堆分配,而這些分配將花費更長的時間。你可以在不附加調試器的情況下啟動應用程序,以確定創建設備的實際處理時間。但是不管怎樣,這應該只在多相機設置時需要。

即時相機類

??一個Instant Camera類在內部使用一個pylon device。pylon device需要被創建并將其附加到即時相機對象上以便操作。

//首先使用找到的相機創建一個即時相機類
CInstantCamera camera( CTlFactory::GetInstance().CreateFirstDevice());
// 打印相機型號名稱
cout << "Using device " << camera.GetDeviceInfo().GetModelName() << endl;
// 開始抓取c_countOfImagesToGrab 圖像.
//使用自有連續采集方式進行相機設備的默認參數初始化.
camera.StartGrabbing( c_countOfImagesToGrab);
// 這個智能指針用于抓取結果數據.
CGrabResultPtr ptrGrabResult;
//當c_countOfImagesToGrab圖像被重新取回時RetrieveResult()方法會自動調用Camera.StopGrabbing() 
while ( camera.IsGrabbing())
{
    // Wait for an image and then retrieve it. A timeout of 5000 ms is used.
    camera.RetrieveResult( 5000,     ptrGrabResult,TimeoutHandling_ThrowException);
    // 圖像是否抓取成功?
    if (ptrGrabResult->GrabSucceeded()){
      // Access the image data.
      cout << "SizeX: " << ptrGrabResult->GetWidth() << endl;
      cout << "SizeY: " << ptrGrabResult->GetHeight() << endl;
      const uint8_t *pImageBuffer = (uint8_t *) ptrGrabResult->GetBuffer();
      cout << "Gray value of first pixel: " << (uint32_t) pImageBuffer[0] << endl <<endl;
      }
      else
      {
          cout << "Error: " << ptrGrabResult->GetErrorCode() << " " << ptrGrabResult->GetErrorDescription() << endl;
      }
 }

即時相機類的主要特性

??即時相機類建立了對相機設備的方便訪問,同時高度可定制。下面的列表顯示了即時類的主要特性:

  1. 作為相機功能的單一訪問點
  2. 它可以在不設置任何參數的情況下“開箱即用”。相機使用設備的默認配置。可以重寫默認配置。
  3. 處理pylon設備的生命周期
  4. 自動打開和關閉pylon設備
  5. 提供緩沖區的創建、重用和銷毀處理功能
  6. 如果需要可以提供循環抓取線程
  7. 可以檢測相機設備的移除
  8. 支持先進的相機功能,如塊模式和事件報告
  9. 可派生擴展
  10. 通過注冊額外的事件處理程序對象進行擴展
即時相機類型
圖片.png

??通用的CInstantCamera相機類允許操作所有類型的相機設備。當為多種設備類型(如GigE和IIDC 1394設備)編程時,如果在編譯時不知道使用的設備類型,則應該使用該類。
??設備特定的即時相機類是CInstantCamera的專門化,通過一個參數類擴展它。parameter類為每個相機參數提供一個成員。當只為一種設備類型(例如GigE設備)編程時,應該使用這些特定于設備的即時相機類之一。

即時相機類事件處理

??Instant Camera類允許注冊事件處理程序對象,用于定制相機對象的行為、處理抓取結果和處理相機事件。下面的列表顯示了可用的事件處理程序類型。

  • 配置事件處理--可用于自定義相機的行為;必須從Pylon::CConfigurationEventHandler基類派生
  • 圖像事件處理--可用于抓取結果的處理;必須從Pylon::CImageEventHandler基類派生。
  • 相機事件處理--必須用于處理相機事件;必須從pylon::CCameraEventHandler基類派生。
    注:對于特定于設備的即時相機類,可以使用單獨的事件處理程序基類,這些基類使用特定于設備的即時相機類和特定于設備的抓取結果智能指針類。
    ??自定義事件處理程序類可以覆蓋基類的一個或多個虛擬方法。例如,當一個即時相機對象調用Pylon::CConfigurationEventHandler:: onopen時,就是設置相機參數的合適時間。下面的代碼片段顯示了配置事件處理程序設置感興趣的圖像區域(圖像AOI)和像素格式的示例。
    圖片.png

    ??可以在Instant Camera對象中注冊一個或多個事件處理程序對象。下面的代碼片段顯示了如何注冊上述事件處理程序并將其附加到配置事件處理程序列表的示例。
    圖片.png
配置

?emsp;配置事件處理程序類也稱為“配置”,因為它們封裝了特定的相機配置。pylon c++ API附帶了以下配置類:

  • Pylon::CAcquireSingleFrameConfiguration- 單次采集模式.

  • Pylon::CAcquireContinuousConfiguration. -連續采集模式

  • Pylon::CSoftwareTriggerConfiguration- 軟件觸發模式.

  • Pylon::CActionTriggerConfiguration - 指令觸發 (applies to GigE Vision only)
    ??這些類作為頭文件提供。這樣就可以看到相機的哪些參數發生了變化。可以復制和修改代碼來創建自己的配置類。例如,可以使用CSoftwareTriggerConfiguration作為創建硬件觸發器配置的基礎,只需要很少的修改。當創建一個即時相機類時,已經注冊了CAcquireContinuousConfiguration,它提供了一個默認設置,適用于大多數相機。

// 注冊用于啟用軟件觸發的標準配置事件處理程序
// 軟件觸發器配置處理程序替換默認配置
// 因為通過將注冊模式設置為RegistrationMode_ReplaceAll,可以刪除所有當前注冊的配置處理程序。
camera.RegisterConfiguration( new CSoftwareTriggerConfiguration, RegistrationMode_ReplaceAll, Cleanup_Delete);
使用即時相機陣列處理多個相機

即時相機陣列類幫助管理系統中的多個相機。一個即時相機數組表示一個即時相機對象數組。它提供了幾乎相同的界面,作為一個即時相機抓拍。CInstantCameraArray的主要目的是簡化在一個線程中等待多個相機的圖像和相機事件。這是通過為數組中的所有相機提供一個RetrieveResult方法來實現的。以下類可供選擇:

  • Pylon::CInstantCameraArray - 如果在編譯時不知道所使用的相機設備的類型,則使用
  • Pylon::CBasler1394InstantCameraArray - 與1394相機一起使用
  • Pylon::CBaslerGigEInstantCameraArray - 千兆網相機使用
  • Pylon::CBaslerUsbInstantCameraArray - USB相機使用

參數訪問

??對于相機配置和訪問其他參數,pylon API使用GenICam標準定義的技術。GenICam規范(http://www.GenICam.org)為相機參數描述文件定義了一種格式。這些文件描述了GenICam兼容相機的配置接口。描述文件用XML(可擴展標記語言)編寫,描述相機寄存器、它們之間的相互依賴關系,以及通過低級寄存器讀寫操作訪問高級特性(如增益、曝光時間或圖像格式)所需的所有其他信息。
??相機描述文件的元素表示為稱為節點的軟件對象。例如,一個節點可以表示單個相機寄存器、相機參數(如增益)、一組可用參數值等。每個節點實現GenApi::INode接口。
??節點有不同的類型。例如,有表示整數值的節點和表示字符串的其他節點。對于每種類型的參數,GenApi中都有一個接口。這些接口在參數類型一節中進行了描述。參數訪問模式部分介紹了參數訪問模式的概念。訪問模式屬性用于確定參數是否可用、可讀或可寫。

本地參數訪問

??pylon提供編程接口類,這些類使用GenICam的GenApi模塊提供的代碼生成器從參數描述文件創建。這些編程接口類由設備特定的即時相機類導出。因此,為每個可用參數提供一個成員。這是訪問參數的最簡單方法。

// Maximize the image area of interest (Image AOI).
if (IsWritable(camera.OffsetX)){
  camera.OffsetX.SetValue(camera.OffsetX.GetMin());
}
if (IsWritable(camera.OffsetY)){
  camera.OffsetY.SetValue(camera.OffsetY.GetMin());
}
camera.Width.SetValue(camera.Width.GetMax());
camera.Height.SetValue(camera.Height.GetMax());
// Set the pixel data format.
camera.PixelFormat.SetValue(PixelFormat_Mono8);
泛型參數訪問

??完整的節點集存儲在名為節點映射的數據結構中。在運行時,節點映射從XML描述實例化。當在編譯時使用的設備類型未知時,必須使用節點映射對象訪問參數或節點。這適用于,例如,當機器視覺應用程序可能使用多種類型的攝像機設備時,例如GigE和IIDC 1394設備。

 // Allow all the names in the namespace GenApi to be used without qualification.
    using namespace GenApi;
    // Get the camera control object.
    INodeMap &control = camera.GetNodeMap();
    // Get the parameters for setting the image area of interest (Image AOI).
    const CIntegerPtr width = control.GetNode("Width");
    const CIntegerPtr height = control.GetNode("Height");
    const CIntegerPtr offsetX = control.GetNode("OffsetX");
    const CIntegerPtr offsetY = control.GetNode("OffsetY");
    // Maximize the Image AOI.
    if (IsWritable(offsetX) {
       offsetX->SetValue(offsetX->GetMin());
    }
    if (IsWritable(offsetY)) {
        offsetY->SetValue(offsetY->GetMin());
    }
    width->SetValue(width->GetMax());
    height->SetValue(height->GetMax());
    // Set the pixel data format.
    CEnumerationPtr(control.GetNode("PixelFormat"))->FromString("Mono8");
數據類型
  • GenApi::IInteger
  • GenApi::IFloat
  • GenApi::IBoolean
  • GenApi::IEnumeration
  • GenApi::ICommand
  • GenApi::IString
參數訪問模式

??每個參數都有一個訪問模式,該模式描述特性是否實現、可用、可讀和可寫。對于給定的相機,可能根本不實現功能。例如,單色相機將不包括白平衡功能。根據相機的狀態,功能可能暫時不可用。例如,當相機處于自由運行模式時,與外部觸發相關的參數可能不可用。可用的特性可以是只讀的、只寫的,也可以是可讀可寫的。
??通過調用參數的GetAccessMode()方法可以查詢參數的當前狀態,該方法返回一個GenApi::EAccessMode枚舉值,該枚舉值描述如下表:


圖片.png

??參數的訪問模式可以在運行時更改。例如,當相機獲取圖像時,AOI寬度和AOI高度將是只讀的。因此,建議在使用參數之前檢查參數的訪問模式。因此,GenApi名稱空間包含以下幫助函數,它們要么接受EAccessMode值、指針,要么接受對參數的引用:

  • GenApi::IsImplemented
  • GenApi::IsAvailable
  • GenApi::IsReadable
  • GenApi::IsWritable
#include <pylon/gige/BaslerGigEInstantCamera.h>
using namespace Basler_GigECameraParams;

// ...
// If the AOI width is writable, set the AOI width
if ( GenApi::IsWritable ( camera.Width ) )
camera.Width = 640;
// If the pixel format is supported, set the camera to Mono16 pixel format
if ( GenApi::IsAvailable( camera.PixelFormat.GetEntry(PixelFormat_Mono16)) )
camera.PixelFormat.SetValue( PixelFormat_Mono16 );
// ...

圖像抓取

??本節展示如何使用Instant Camera類抓取圖像。在抓取圖像之前,必須使用以下一種或多種方法設置相機參數:

  • 注冊的configureation objects配置相機。
  • 調用Open()后,使用程序流中的代碼設置相機。
  • 相機是預配置的,例如使用pylon查看器。這些設置存儲在相機的用戶集中,并在相機啟動時激活,前提是選擇用戶集作為“啟動集”。
  • 參數從磁盤加載。
    注:使用后三種方法可能需要在創建Instant Camera對象后刪除默認配置。下面的例子展示了如何做到這一點。在調用Open()方法之前,必須刪除配置。
    圖片.png
采集、傳輸和圖像抓取

??在本文檔中,我們區分了圖像采集、圖像數據傳輸和圖像抓取。
??我們把相機內部的過程稱為圖像采集。當相機開始圖像采集時,傳感器就會暴露出來。曝光完成后,從傳感器讀出圖像數據。
??所獲得的圖像數據通過IEEE 1394或千兆以太網等接口從相機內存傳輸到PC機。
??將圖像數據寫入PC主存儲器的過程稱為“抓取”圖像。

結果獲取

??抓取圖像的數據由抓取結果數據對象持有。抓取結果數據對象無法直接被訪問。它總是由一個抓取結果智能指針持有(例如:基本的抓取結果智能指針CGrabResultPtr)。智能指針與抓取結果數據對象的結合也稱為抓取結果。智能指針控制抓取結果數據對象和相關圖像緩沖區的重用和生存期。當所有引用抓取結果數據對象的智能指針超出范圍時,抓取結果的圖像緩沖區將被用于抓取。由于智能指針的概念,一個抓取結果數據對象和相關的圖像緩沖區可以比用于抓取圖像數據的相機對象活得更長。每個設備特定的Instant Camera類都有一個設備特定的抓取結果數據對象和一個設備特定的抓取結果智能指針。通過復制或賦值,可以將設備特定的抓取結果智能指針轉換為或從基本的抓取結果智能指針CGrabResultPtr。
??抓取結果智能指針類提供了一個轉換操作符,允許將抓取結果智能指針直接傳遞給函數或方法,這些函數或方法使用const Pylon:: iimage作為參數,例如圖像保存函數。

緩沖區處理

??從StartGrabbing()開始,為每個grab會話自動分配新的緩沖區。抓取圖像的緩沖區由抓取結果數據對象持有。在抓取過程中,當抓取結果智能指針釋放抓取結果數據對象時,緩沖區將被重用。如果在抓取停止時釋放抓取結果數據對象,則釋放緩沖區。
??可以使用MaxNumBuffer參數設置使用的圖像數據緩沖區的數量。用于抓取的默認緩沖區數量為10。
??抓取所需的緩沖區大小會被自動確定。
當抓取一個定義的圖像數量小于MaxNumBuffer的值時,分配的緩沖區的數量會自動減少,例如5。
注:可以將緩沖工廠附加到即時相機對象上,以便使用用戶提供的緩沖。緩沖工廠的使用是可選的,并且只適用于高級用例。

抓取引擎

??即時相機抓取引擎由一個空的緩沖區隊列、一個輸出隊列和一個抓取線程組成。抓取引擎使用低級API流抓取器抓取圖像。空緩沖區隊列和輸出隊列可以保存MaxNumBuffer參數定義的緩沖區數量。MaxNumQueuedBuffer緩沖區在任何時候都被傳遞給低級API流抓取器。所有隊列都以FIFO模式(先進先出)工作。grab引擎線程確保流抓取器不會耗盡緩沖區,只要緩沖區在空緩沖區隊列中可用。

默認one by one抓取策略

??即時相機支持不同的抓取策略。默認策略是一個接一個。當采用逐幀抓取策略時,圖像按采集順序進行處理。


圖片.png
  1. 即時相機抓取引擎從空緩沖區隊列中取出緩沖區,并在低級API流抓取器(1)中對空緩沖區進行排隊。
  2. 相機設備被觸發(2)。相機設備獲取圖像,將圖像傳輸到PC機,然后抓取到一個空的緩沖區中。
  3. 即時相機抓取引擎線程被通知有一個已填充的緩沖區可用。已填充的緩沖區由grab engine線程(3)檢索并放入輸出隊列。
  4. 在RetrieveResult()方法中等待的應用程序線程將得到通知,它停止等待抓取結果,并作為抓取結果數據對象的一部分檢索已填充的緩沖區(4)。
  5. 抓取結果數據對象由抓取結果智能指針持有。應用程序處理完圖像數據后,將填滿的緩沖區返回到空緩沖區隊列(5)。這是由grab result智能指針析構函數或當grab result數據對象顯式釋放時完成的。返回的緩沖區再次用于抓取。
在一個循環中抓取圖像
//使用第一個發現的相機設備創建一個即時相機對象
CInstantCamera camera( CTlFactory::GetInstance().CreateFirstDevice());
// 打印相機模式名稱
cout << "Using device " << camera.GetDeviceInfo().GetModelName() << endl;
// 開始抓取 c_countOfImagesToGrab 圖像.
// 相機設備是參數化的默認配置,設置自由運行的連續采集。
camera.StartGrabbing( c_countOfImagesToGrab);
// 用于接收抓取結果數據的智能指針
CGrabResultPtr ptrGrabResult;

//當c_countOfImagesToGrab被重新取回時,
// Camera.StopGrabbing() 被RetrieveResult()方法自動調用
while ( camera.IsGrabbing())
{
    // 等待一幀圖像并取回. 設置超時500ms
    camera.RetrieveResult( 5000, ptrGrabResult, TimeoutHandling_ThrowException);

    // 圖像是否被專區?
    if (ptrGrabResult->GrabSucceeded())
    {
        //訪問圖像數據信息.
        cout << "SizeX: " << ptrGrabResult->GetWidth() << endl;
        cout << "SizeY: " << ptrGrabResult->GetHeight() << endl;
        const uint8_t *pImageBuffer = (uint8_t *) ptrGrabResult->GetBuffer();
        cout << "Gray value of first pixel: " << (uint32_t) pImageBuffer[0] << endl << endl;

    }
    else
    {
        cout << "Error: " << ptrGrabResult->GetErrorCode() << " " << ptrGrabResult->GetErrorDescription() << endl;
    }
}

??創建相機對象。通過調用startgrab()開始抓取。由于相機還沒有打開,它將通過startgrab()方法自動打開。調用默認配置事件處理程序并應用默認配置。圖像被即時相機對象連續抓取,抓取結果按相機要求的順序放入即時相機的輸出隊列中(抓取策略一個接一個)。RetrieveResult()方法用于等待抓取結果并從輸出隊列中檢索它。一些抓取結果數據在檢索后被打印到屏幕上。在檢索c_countOfImagesToGrab圖像時,RetrieveResult()方法自動調用stopgrab()。while語句條件用于檢查抓取是否已停止。
??通過在startgrab()調用中省略要抓取的最大圖像數量,并從grab循環內部調用stopgrab()來完成抓取,可以開始抓取無限數量的圖像。

使用即時相機提供的抓取循環線程抓取圖像

??Instant Camera類可以選擇性地提供一個抓取循環線程。該線程運行一個抓取循環,反復調用RetrieveResult()。當使用提供的抓取循環線程時,需要一個圖像事件處理程序來處理抓取結果。
使用以下圖像事件處理程序:

class CImageEventPrinter : public CImageEventHandler
{
public:

    virtual void OnImageGrabbed( CInstantCamera& camera, const CGrabResultPtr& ptrGrabResult)
    {
        std::cout << "OnImageGrabbed event for device " << camera.GetDeviceInfo().GetModelName() << std::endl;

        // Image grabbed successfully?
        if (ptrGrabResult->GrabSucceeded())
        {
            std::cout << "SizeX: " << ptrGrabResult->GetWidth() << std::endl;
            std::cout << "SizeY: " << ptrGrabResult->GetHeight() << std::endl;
            const uint8_t *pImageBuffer = (uint8_t *) ptrGrabResult->GetBuffer();
            std::cout << "Gray value of first pixel: " << (uint32_t) pImageBuffer[0] << std::endl;
            std::cout << std::endl;
        }
        else
        {
            std::cout << "Error: " << ptrGrabResult->GetErrorCode() << " " << ptrGrabResult->GetErrorDescription() << std::endl;
        }
    }
};

下面的示例展示如何使用Instant Camera對象提供的grab循環線程進行抓取:

// 圖像事件打印機用作示例圖像處理.
// 當使用由Instant Camera對象提供的抓取循環線程時,必須創建并注冊一個處理抓取結果的圖像事件處理程序
camera.RegisterImageEventHandler( new CImageEventPrinter, RegistrationMode_Append, Cleanup_Delete);

// 通過設置GrabLoop_ProvidedByInstantCamera的grabLoopType參數,使用grab loop線程啟動抓取
//  抓取結果被交付給圖像事件處理程序,使用GrabStrategy_OneByOne默認抓取策略
camera.StartGrabbing( GrabStrategy_OneByOne, GrabLoop_ProvidedByInstantCamera);

cerr << endl << "Enter \"t\" to trigger the camera or \"e\" to exit and press enter? (t/e)" << endl << endl;

// 等待用戶輸入觸發相機或退出程序.
// 停止抓取,關閉設備,當相機對象超出范圍時自動銷毀.
char key;
do
{
cin.get(key);
if ( (key == 't' || key == 'T'))
{
    //執行軟件觸發器。等待到達500毫秒的相機準備觸發.
    if ( camera.WaitForFrameTriggerReady( 500, TimeoutHandling_ThrowException))
    {
        camera.ExecuteSoftwareTrigger();
    }
}
}
while ( (key != 'e') && (key != 'E'));

??首先,注冊映像事件處理程序。每抓取一張圖片,它都會在屏幕上打印一條信息。在本例中,它用作圖像處理。對于無限數量的圖像,使用startgrab()啟動抓取,并通過將第二個參數設置為GrabLoop_ProvidedByInstantCamera,使用InstantCamera對象提供的抓取循環線程。現在可以使用主線程查詢用戶的輸入,以觸發圖像或退出輸入循環。在本例中,抓取沒有顯式停止,可以通過調用stopgrab()來停止。

抓取一幀圖像

??為了方便起見,可以使用GrabOne()方法來抓取單個圖像。下面的代碼顯示了所做工作的簡化版本

//grab one image
StartGrabbing( 1, GrabStrategy_OneByOne, GrabLoop_ProvidedByUser);

//grab is stopped automatically due to maxImages = 1
return RetrieveResult( timeoutMs, grabResult, timeoutHandling) && grabResult->GrabSucceeded();

??如果pylon設備已經打開,則使用GrabOne()更有效,否則每次調用都會自動打開和關閉pylon設備。
??如果您想最大化幀率,建議使用SoftwareTrigger (CSoftwareTriggerConfiguration)抓取單個圖像。這是因為與單幀采集相比,每次抓取圖像的開銷減少了。可以使用StartGrabbing()啟動抓取。使用WaitForFrameTriggerReady()、ExecuteSoftwareTrigger()和RetrieveResult()方法捕捉圖像,而不是使用GrabOne()。抓取完成后,可以使用StopGrabbing()停止抓取。

使用先進的相機功能

相機事件處理

??Basler GigE Vision、USB3 Vision和IIDC 1394攝像機可以發送事件消息。例如,當傳感器曝光完成時,相機可以向PC發送曝光結束事件。可以通過在一個Instant Camera類中注冊一個圖像事件處理程序來接收事件。

訪問塊功能

??Basler攝像機能夠發送附加到圖像數據的所謂數據塊的附加信息,比如幀計數器、時間戳或CRC校驗和。如果被激活,數據塊將由Instant Camera類自動解析

獲取關于相機設備移除的信息

??要獲得關于攝像機設備移除的信息,可以查詢IsCameraDeviceRemoved()方法,或者注冊配置事件處理程序。如果移除攝像機設備,則調用OnCameraDeviceRemoved()虛擬方法
注:OnCameraDeviceRemoved調用是從一個單獨的線程發出的。

GigE多播/廣播:在多臺pc上抓取一臺相機的圖像

??Basler GigE攝像機可以配置為將圖像數據流發送到多個目的地。可以使用IP組播或IP廣播。

圖像處理和圖像顯示

??除了用于抓取圖像的即時相機類外,pylon還提供了額外的圖像處理支持,支持處理抓取的圖像。圖像類,Windows位圖圖像支持,一個圖像格式轉換器,一個圖像窗口,以及圖像的加載和保存。

pylon圖像類

??在處理圖像數據時,緩沖區大小和生存期的處理通常涉及大量編碼。Pylon::CPylonImage類簡化了這一點。它還允許附加抓取結果的緩沖區,以防止在需要時重用它。此外,還可以連接用戶緩沖區或由第三方軟件包提供的緩沖區。此外,當使用圖像平面或AOIs時,pylon像類也會有所幫助。utility y_image代碼示例顯示了pylon映像類的使用。

pylon位圖圖像類

??pylon::CPylonBitmapImage類簡化了用于顯示圖像數據的Windows位圖圖像的創建。

圖像格式轉換

??Pylon::CImageFormatConverter通過將源圖像轉換為另一種格式來創建新圖像。一旦配置了格式轉換器,它就可以轉換幾乎所有Basler攝像機設備支持的圖像格式。

AVI writter

??Pylon::CAviWroter可用于創建音頻視頻交錯(AVI)格式的視頻文件。

加載和保存圖形

??Pylon::CImagePersistence支持加載和保存圖形至硬盤。pylon映像類在內部使用這個接口,并提供加載和保存方法。

pylon 圖像顯示

??pylon圖像窗口允許您使用DisplayImage或CPylonImageWindow類輕松地在屏幕上顯示圖像。您可以使用CPylonImageWindow類來檢查從攝像機檢索到的圖像或CPixelFormatConverter的結果。
??每個pylon圖像窗口都由一個惟一的圖像窗口索引來尋址。有效的圖像窗口索引范圍從0到31.
??全局函數DisplayImage()提供了在屏幕上顯示圖像的最簡單方法。您需要指定用于圖像顯示的圖像窗口的圖像窗口索引,并傳遞圖像或獲取結果。這將在必要時創建窗口,設置內容,并在屏幕上顯示窗口。圖像窗口將在內存中創建圖像的副本,以便在函數返回后釋放圖像或安全地獲取結果。
??要清除窗口并釋放圖像所需的內存,可以顯示一個空圖像。
??當用戶使用鼠標或按Alt+F4關閉圖像窗口時,圖像窗口只會被隱藏。您可以調用CPylonImageWindow::Show()使其再次可見。
??要實際銷毀窗口,必須調用CPylonImageWindow::Close()。如果您不關閉窗口,pylon將在調用PylonTerminate時關閉所有現有的映像窗口。
注:所有CPylonImageWindow函數都是完全線程安全的。
??如果需要對圖像窗口進行更多控制,可以顯式地調用CPylonImageWindow::Create()并傳遞圖像窗口的位置和大小。調用CPylonImageWindow::Create()后,圖像窗口在屏幕上不可見。要使其可見,必須調用CPylonImageWindow::Show()。
??當CPylonImageWindow::Create()成功返回時,對象將存儲在CPylonImageWindow::Create()中傳遞的圖像窗口索引,并將其用于所有其他成員函數。當CPylonImageWindow對象被銷毀時,析構函數將關閉圖像窗口。如果希望保留圖像窗口,必須在銷毀對象之前調用CPylonImageWindow::Detach()。
要使用Pylon圖像窗口,需要包含pylon/PylonGUIIncludes.h頭文件。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容