提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔
前言
做項(xiàng)目過(guò)程中需要對(duì)Basler相機(jī)進(jìn)行二次開(kāi)發(fā),所以寫(xiě)一些記錄給大家參考。
附上一些在其他地方看到的參考資料:
- Basler 工業(yè)相機(jī)與Python開(kāi)發(fā)鏈接: link
- Basler 工業(yè)相機(jī) Python開(kāi)發(fā)采集數(shù)據(jù)、保存照片: link
- pypylon模塊調(diào)用basler相機(jī)采集數(shù)據(jù): link
一、相機(jī)類 InstantCamera
1. class InstantCamera (InstantCamera Params_Params)
# 提供方便的訪問(wèn)相機(jī)設(shè)備。
? 為訪問(wèn)相機(jī)功能建立一個(gè)單一的訪問(wèn)點(diǎn)。這個(gè)類可以在沒(méi)有任何參數(shù)的情況下使用。相機(jī)使用相機(jī)設(shè)備的默認(rèn)配置,可被覆蓋。
? 處理Pylon設(shè)備的生存期,可被覆蓋。
? 自動(dòng)處理打開(kāi)和關(guān)閉一個(gè)Pylon設(shè)備。
? 處理塊數(shù)據(jù)解析,自動(dòng)返回抓取結(jié)果中的塊數(shù)據(jù)。
? 自動(dòng)處理事件抓取,為事件回調(diào)提供了一個(gè)方便的接口,可被覆蓋。
? 處理物理相機(jī)設(shè)備移除。
? 處理緩沖區(qū)的創(chuàng)建、重用和銷(xiāo)毀。
? 抓取可以在調(diào)用者的上下文中完成,也可以使用額外的抓取循環(huán)線程。
? Instant Camera類可以通過(guò)派生或注冊(cè)事件處理程序?qū)ο筮M(jìn)行擴(kuò)展。
其中主要的函數(shù):
def Attach(self,*args)->"void":
# 將Pylon設(shè)備連接到InstantCamera
參數(shù):
? pDevice-要連接的Pylon設(shè)備。
? cleanupProcedure-如果cleanupProcedure等于Cleanup_Delete,則在銷(xiāo)毀Instant Camera對(duì)象時(shí)銷(xiāo)毀Pylon設(shè)備。
? 如果當(dāng)前連接了一個(gè)Pylon設(shè)備,則根據(jù)先前設(shè)置的清理過(guò)程值,將其銷(xiāo)毀(DestroyDevice())或移除(DetachDevice())。
? 如果pDevice參數(shù)為NULL,則不再執(zhí)行任何操作。OnAttach配置事件被觸發(fā)。
? 附加新的Pylon設(shè)備。如果傳遞的Pylon設(shè)備是打開(kāi)的,則相機(jī)事件的回調(diào)將在相機(jī)節(jié)點(diǎn)映射上注冊(cè)。(這可能會(huì)失敗)
如果傳遞的Pylon設(shè)備是打開(kāi)的,則注冊(cè)一個(gè)設(shè)備移除回調(diào)(這可能會(huì)失敗)。訪問(wèn)修飾符(參見(jiàn)IPylonDevice:: open())將被取代為相機(jī)參數(shù)。
? OnAttached配置事件被觸發(fā)。來(lái)自事件調(diào)用的可能的c++異常被捕獲并忽略。通知所有事件處理程序。
Post:
? 如果傳遞給Pylon設(shè)備的指針為NULL,則Instant Camera對(duì)象處于“無(wú)設(shè)備連接”狀態(tài)。
? 如果指針不是NULL,則連接傳遞的Pylon設(shè)備。
? 如果設(shè)置的清除過(guò)程等于Cleanup_Delete,則在銷(xiāo)毀Instant Camera對(duì)象或附加新設(shè)備時(shí)銷(xiāo)毀Pylon設(shè)備。
? 如果傳遞的Pylon設(shè)備是打開(kāi)的,并且回調(diào)注冊(cè)失敗,則Instant Camera對(duì)象處于“未連接設(shè)備”狀態(tài)。
? 設(shè)置了“由用戶打開(kāi)”標(biāo)志,以防止在附加的Pylon設(shè)備已經(jīng)打開(kāi)時(shí),在stopgrab()上關(guān)閉Pylon設(shè)備。
? 如果傳遞的Pylon設(shè)備打開(kāi),則可能引發(fā)異常。如果傳遞的Pylon設(shè)備關(guān)閉或?yàn)镹ULL,則不拋出C+異常。
? 該方法使用GetLock()提供的Lock進(jìn)行同步。
def IsPylonDeviceAttached(self)->"bool":
# 返回Instant Camera對(duì)象的Pylon設(shè)備連接狀態(tài)
def RegisterImageEventHandler(self,pImageEventHandler:"ImageEventHandler",mode: "Pylon::ERegistrationMode",cleanupProcedure:"Pylon::ECleanup")->"void":
# 將圖像事件處理程序添加到已注冊(cè)圖像事件處理程序?qū)ο蟮牧斜怼?
? 如果mode = RegistrationMode_ReplaceAll,則已注冊(cè)的圖像事件處理程序列表將被清除.
?如果指針 pImageEventHandler 不是NULL,它將被追加到圖像事件處理程序列表中.
參數(shù):
? pImageEventHandler 圖像事件的接收者。
? mode 指示如何注冊(cè)新的imageEventHandler。
? cleanupProcedure 如果=Cleanup_Delete,則在不再需要時(shí)刪除傳遞的事件處理程序。
? imageEventHandler在圖像相關(guān)事件時(shí)被注冊(cè)和調(diào)用。
? 不拋出c++異常,除非內(nèi)存分配失敗。此方法使用內(nèi)部圖像事件處理程序注冊(cè)表進(jìn)行同步鎖。
def StartGrabbing(self,*args)->"void":
# 開(kāi)始抓取最大數(shù)量的圖像
? 擴(kuò)展起始抓取(EStrategy, EGrabLoop)的一些圖像來(lái)抓取。如果已達(dá)到傳遞的圖像計(jì)數(shù),則自動(dòng)調(diào)用stopgrabs。
? 根據(jù)抓取策略對(duì)圖像進(jìn)行計(jì)數(shù)。跳過(guò)的圖像不會(huì)被考慮在內(nèi)。
? 當(dāng)抓取的圖像少于MaxNumBuffer參數(shù)的值時(shí),分配的緩沖區(qū)數(shù)量減少到maxImages,并且抓取策略為GrabStrategy_OneByOne。
參數(shù):
? maxImages要抓取的圖像的計(jì)數(shù)。該值必須大于零。
? strategy抓取策略。更多信息請(qǐng)參見(jiàn)Pylon::InstantCamera::EStrategy。
? grabLoopType如果grabLoopType等于GrabLoop_ProvidedByInstantCamera,則使用一個(gè)額外的抓取循環(huán)線程來(lái)運(yùn)行抓取循環(huán)。該方法使用GetLock()提供的鎖進(jìn)行同步。
def RetrieveResult(self,*args)->"bool":
# 根據(jù)策略檢索抓取結(jié)果,如果還不可用則等待
? 釋放通過(guò)抓取結(jié)果的內(nèi)容。
? 如果沒(méi)有附加Pylon設(shè)備或抓取未啟動(dòng),該方法立即返回“false”。
? 如果還沒(méi)有,請(qǐng)等待抓取結(jié)果。在等待過(guò)程中,攝像頭的訪問(wèn)不被鎖定。相機(jī)事件被處理。
? 僅當(dāng)使用相機(jī)事件時(shí):傳入的相機(jī)事件被處理。
? 根據(jù)所應(yīng)用的策略,每次呼叫檢索一個(gè)抓取結(jié)果。
? 僅當(dāng)使用chunk模式時(shí):進(jìn)行chunk數(shù)據(jù)解析。抓取結(jié)果數(shù)據(jù)使用塊數(shù)據(jù)更新。
? 圖像事件OnImagesSkipped被觸發(fā),如果抓取結(jié)果已經(jīng)根據(jù)策略跳過(guò)。當(dāng)事件調(diào)用觸發(fā)異常時(shí),事件處理程序的通知將停止。
? 如果抓取結(jié)果可用,則觸發(fā)圖像事件onimagegrabs。
當(dāng)事件調(diào)用觸發(fā)異常時(shí),事件處理程序的通知將停止。
? 如果已抓取圖像的最大數(shù)量,則調(diào)用stopgrabs()停止抓取。
需要檢查抓取結(jié)果所代表的抓取是否成功,參見(jiàn)CGrabResultData::GrabSucceeded()。
參數(shù):
? timeoutMs: 等待抓取結(jié)果的超時(shí)值(以毫秒為單位)或INFINITE值。
? grabResult: 接收抓取結(jié)果。
? timeoutHandling: 如果timeoutHandling = TimeoutHandling_ThrowException,則在超時(shí)時(shí)拋出超時(shí)異常。
返回:
? 如果調(diào)用成功檢索抓取結(jié)果為T(mén)rue,否則為false。
? 沒(méi)有其他線程在等待結(jié)果。這將是使用即時(shí)相機(jī)抓取循環(huán)線程的情況。
Post:
? 如果抓取結(jié)果已被檢索,則從輸出隊(duì)列中刪除一張圖像,并在grabResult參數(shù)中返回。
? 如果沒(méi)有抓取結(jié)果,在grabResult參數(shù)中返回一個(gè)空的抓取結(jié)果。
? 如果已抓取圖像的最大數(shù)量,則抓取停止。
? 如果啟用了相機(jī)事件處理,并且收到了相機(jī)事件,則至少一個(gè)或多個(gè)相機(jī)事件消息已被處理。
? 即時(shí)相機(jī)對(duì)象在錯(cuò)誤后仍然有效。如果拋出一個(gè)異常則抓取結(jié)束。
? 該方法在不等待時(shí)使用GetLock()提供的鎖進(jìn)行同步。
def GetTLNodeMap(self)->"GENAPI_NAMESPACE::INodeMap&":
# 提供對(duì)所附Pylon設(shè)備的傳輸層節(jié)點(diǎn)映射的訪問(wèn)
返回:
? 對(duì)連接的Pylon設(shè)備的傳輸層節(jié)點(diǎn)映射的引用,或者如果不支持傳輸層節(jié)點(diǎn)映射,則對(duì)空節(jié)點(diǎn)映射的引用。
? GENAPI_NAMESPACE::INodeMap::GetNumNodes()方法可以用來(lái)檢查節(jié)點(diǎn)映射是否為空。
? 前提:已連接相機(jī)設(shè)備。
? 即時(shí)相機(jī)對(duì)象在錯(cuò)誤后仍然有效。該方法使用GetLock()提供的鎖進(jìn)行同步。
2. class DeviceInfo(CInfoBase):
# 保存關(guān)于枚舉設(shè)備的信息
設(shè)備枚舉過(guò)程創(chuàng)建一個(gè)CDeviceInfo對(duì)象列表(Pylon::DeviceInfoList_t)。每個(gè)CDeviceInfo對(duì)象存儲(chǔ)設(shè)備的信息。
在設(shè)備枚舉過(guò)程中檢索信息(ITransportLayer::EnumerateDevices resp. CTlFactory:: EnumerateDevices)
def GetUserDefinedName(self)->"Pylon::String_t":
# 檢索用戶定義的名稱(如果存在),此屬性由Key::UserDefinedNameKey標(biāo)識(shí)
def GetDeviceFactory(self)->"Pylon::String_t":
# 檢索能夠創(chuàng)建此設(shè)備的傳輸層的標(biāo)識(shí)符。此屬性由Key::DeviceFactoryKey標(biāo)識(shí)
3. class TlFactory(object):
# 傳輸層工廠,創(chuàng)建、銷(xiāo)毀和枚舉傳輸層及其設(shè)備
def GetInstance()->"Pylon::CTlFactory&":
# 檢索傳輸層工廠單例
def CreateFirstDevice(self,*args)->"Pylon::IPylonDevice*":
# 從設(shè)備信息對(duì)象中創(chuàng)建第一個(gè)找到的設(shè)備,注入額外的GenICam XML定義字符串
def CreateDevice(self,*args)->"Pylon::IPylonDevice*":
二、圖像事件處理類 ImageEventHandler
4. class ImageEventHandler(object):
# 圖像事件處理程序基類
def OnImagesSkipped(self, camera:"InstantCamera", countOfSkippedImages:"size_t")->"void":
# 當(dāng)使用GrabStrategy_LatestImageOnly策略或GrabStrategy_LatestImages策略跳過(guò)圖像時(shí),將調(diào)用此方法
參數(shù):
? camera: 調(diào)用的源。
? countOfSkippedImages: 跳過(guò)的圖像數(shù)量。不包括在驅(qū)動(dòng)程序中運(yùn)行緩沖區(qū)時(shí)丟失的圖像數(shù)量。
? 來(lái)自此調(diào)用的異常將繼續(xù)傳播。事件處理程序的通知在異常觸發(fā)時(shí)停止。
? 此方法在相機(jī)對(duì)象的鎖之外調(diào)用,但在圖像事件處理程序注冊(cè)表的鎖內(nèi)部調(diào)用。
def OnImageGrabbed(self, camera:"InstantCamera", grabResult:"GrabResult")->"void":
# 在抓取圖像時(shí)調(diào)用此方法
傳遞的抓取結(jié)果智能指針總是引用抓取結(jié)果數(shù)據(jù)對(duì)象。在訪問(wèn)抓取結(jié)果數(shù)據(jù)之前,需要檢查抓取狀態(tài)。更多信息請(qǐng)參見(jiàn)CGrabResultData::GrabSucceeded(), CGrabResultData::GetErrorCode()和CGrabResultData::GetErrorDescription()。
參數(shù):
? camera :調(diào)用的源。
? grabResult :抓取結(jié)果數(shù)據(jù)。
? 來(lái)自此調(diào)用的異常將繼續(xù)傳播。事件處理程序的通知在異常觸發(fā)時(shí)停止。
? 此方法在相機(jī)對(duì)象的鎖之外調(diào)用,但在圖像事件處理程序注冊(cè)表的鎖內(nèi)部調(diào)用。
def OnImageEventHandlerRegistered(self,camera:"InstantCamera")->"void":
# 當(dāng)注冊(cè)了圖像事件處理程序時(shí),將調(diào)用此方法
def DestroyImageEventHandler(self)->"void":
# 銷(xiāo)毀圖像事件處理程序。
5. class GrabResult(object):
# 一個(gè)智能指針,它持有一個(gè)獲取結(jié)果數(shù)據(jù)的引用
該類用于分配攝像機(jī)的抓取結(jié)果數(shù)據(jù)。它控制引用緩沖區(qū)的重用和生命周期。
當(dāng)所有引用緩沖區(qū)的智能指針超出作用域時(shí),被引用的緩沖區(qū)被重用或摧毀。數(shù)據(jù)和持有的緩沖區(qū)在它產(chǎn)生的相機(jī)對(duì)象被銷(xiāo)毀后仍然有效。
注意: 當(dāng)抓取結(jié)果從未被釋放時(shí),例如當(dāng)放入容器時(shí),抓取將在輸入隊(duì)列欠壓時(shí)停止。
CGrabResultPtr類提供了一個(gè)強(qiáng)制轉(zhuǎn)換操作符,允許將抓取結(jié)果直接傳遞給以const Image&作為參數(shù)的函數(shù)或方法。
例如,圖像保存功能或圖像格式轉(zhuǎn)換方法。
注意: 返回的IImage引用只有在它來(lái)自的CGrabResultPtr對(duì)象沒(méi)有被銷(xiāo)毀的情況下才有效。
引用相同抓取結(jié)果的CGrabResultPtr實(shí)例可以在任何線程上下文中使用。
6. class PylonImage(PylonImageBase):
# 描述圖像
? 自動(dòng)處理圖像緩沖區(qū)的大小和生命周期。
? 允許接管抓取結(jié)果的緩沖區(qū),這是防止其重用,只要需要。
? 允許連接用戶緩沖區(qū)或第三方軟件包提供的緩沖區(qū)。
? 提供加載和保存不同文件格式的圖像的方法。
? 作為圖像格式轉(zhuǎn)換器’ CImageFormatConverter '的主要目標(biāo)格式。
? 簡(jiǎn)化平面圖像的工作。
? 簡(jiǎn)化aoi的提取,例如缺陷的縮略圖。
? 緩沖區(qū)處理:
如果需要,由CPylonImage類自動(dòng)創(chuàng)建的緩沖區(qū)或托管的抓取結(jié)果緩沖區(qū)將被更大的緩沖區(qū)替換。分配的緩沖區(qū)的大小永遠(yuǎn)不會(huì)減少。引用的用戶緩沖區(qū)永遠(yuǎn)不會(huì)被更大的緩沖區(qū)自動(dòng)替換。引用的抓取結(jié)果緩沖區(qū)永遠(yuǎn)不會(huì)被重用。有關(guān)詳細(xì)信息,請(qǐng)參閱Reset()方法。Release()方法可用于分離用戶緩沖區(qū)、釋放托管的抓取結(jié)果緩沖區(qū)或釋放已分配的緩沖區(qū)。
7. class PylonImageBase(IReusableImage):
將圖像保存到磁盤(pán)。將圖像轉(zhuǎn)換為需要保存的格式。
這是一個(gè)調(diào)用CImagePersistence::Save()的方便方法。如果需要,圖像將自動(dòng)轉(zhuǎn)換為新圖像并保存。更多信息參見(jiàn)CImagePersistence:: CanSaveWithoutConversion()。如果圖像文件格式支持,位深度大于8位的圖像將以16位位深度存儲(chǔ)。在這種情況下,像素?cái)?shù)據(jù)是MSB對(duì)齊的。如果需要對(duì)轉(zhuǎn)換進(jìn)行更多的控制,可以使用CImageFormatConverter類在保存輸入圖像之前對(duì)其進(jìn)行轉(zhuǎn)換。
參數(shù):
imageFileFormat: 保存圖像的文件格式
filename: 圖像的名稱和路徑
pOption 額外的選項(xiàng)
pre:
要保存的圖像像素類型必須是Pylon::CImageFormatConverter支持的輸入格式。如果保存圖像失敗,則拋出異常。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-557689.html
總結(jié)
后續(xù)會(huì)更新對(duì)basler相機(jī)控制的具體代碼。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-557689.html
到了這里,關(guān)于Basler工業(yè)相機(jī)python開(kāi)發(fā)(Pypylon)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!