丹東東方測控技術股份有限公司 遼寧 丹東 118000
海康威視的監控產品在工業企業內應用十分廣泛,如何利用海康威視產品實現專有定制化視頻監控系統是十分有意義的。Python語言易學易用,簡單高效,但目前海康官方還未提供Python版SDK。本文介紹了在Windows系統下Python編程環境中,結合海康威視SDK設計和開發工業設備實時視頻監控軟件的方法。
(1)Python簡介。Python是一種跨平臺的計算機程序設計語言。無論是桌面開發序、Web開發、人工智能、自動化運維、科學運算,Python都有著豐富的擴展模塊,使用Python開發應用程序,無疑是高效的。
(2)海康SDK。海康威視SDK即海康提供的開發包,主要包含設備網絡SDK和播放庫SDK(以下簡稱SDK)。海康威視設備網絡SDK是基于設備私有網絡通信協議開發的,為嵌入式網絡硬盤錄像機、網絡攝像機等網絡產品服務的配套模塊,提供Windows和Linux兩個版本,用于遠程訪問和控制設備軟件的二次開發[1]。
模塊Ctypes是Python內建的用于調用動態鏈接庫函數的功能模塊,一定程度上可以用于Python與其他語言的混合編程,可以說Ctypes模塊是Python應用程序與SDK之間的橋梁。
DLL(動態鏈接庫)是Dynamic Link Library的縮寫,在Windows下Python環境中使用ctypes.windll.loadLibrary()函數進行DLL的裝載。本例中海康SDK的DLL載入方法為:sdk=windll.LoadLibrary("HCNetSDK.dll")。
Ctypes提供和c語言兼容的數據類型,可以很方便地調用DLL中的函數。如Ctypes中的cbyte對應c語言中的char及Python中的int/long。
海康SDK頭文件中包含了大量的結構體,在Python中,結構體必須繼承自Ctypes模塊的Structure類。每個子類必須定義_fields_屬性,該屬性是2元素元組的列表,包含字段名和字段類型,其中字段類型必須是Ctypes類型。
在海康SDK頭文件中存在大量的宏定義,在Python中可用全局變量來實現。如云臺控制:TILT_UP=21,TILT_DOWN=22。
回調函數是一個通過函數指針調用的函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用,用于對該事件或條件進行響應。如回調函數的原型為:CMPFUNC=CFUNCTYPE(c_int,POINTER(c_int),POINTER(c_int)),第一個參數c_int表示函數返回值是int類型。
海康SDK調用流程通常為:初始化SDK,用戶登錄,預覽、云臺控制等操作,注銷設備,釋放SDK資源。
初始化函數用于完成初始內存分配等工作,Python中調用方法為sdk.NET_DVR_Init()。
用戶登錄實現用戶的注冊功能,返回用戶ID,該用戶ID具有唯一性,后續對設備的操作都需要通過此ID實現。Python調用方法為,sdk.NET_DVR_Login_V30(sDVRIP,wDVRPort,sUserName,sPassword,Ctypes.byref(DeviceInfo)),byref()用來傳遞引用參數,DeviceInfo為設備信息結構體,繼承至Ctypes.Structure。
視頻預覽模塊實現從網絡設備取實時碼流解碼顯示以及播放控制等功能,Python中調用方法為sdk.NET_DVR_RealPlay_V40(lUserID,Ctypes.byref(lpPreviewInfo),callBack,pUser) 。其中lpPreviewInfo是Ctypes構造的結構體,結構體中lpPreviewInfo.hPlayWnd=hwnd為窗口句柄,用于播放圖像。
云臺控制實現攝像機的鏡頭方位調整及變焦變倍等操作,Python中的調用方法為:sdk.NET_DVR_PTZControl(lRealHandle,dwPTZCommand,dwStop)。
建立報警通道函數在Python中調用方法為sdk.NET_DVR_SetupAlarmChan_V41(lUserID,Ctypes.byref(struAlarmParam)),struAlarmParam是Ctypes構造的報警布放參數結構體。啟動布防前,需要調用注冊回調函數的接口NET_DVR_SetDVRMessageCallBack_V30(),注冊回調函數的格式為“回調函數實例=回調函數類型(具體回調函數)”,然后將回調函數實例作為參數傳給注冊接口。
用戶注銷函數在Python中的調用方法為sdk.NET_DVR_Logout(lUserID)。
釋放資源函數在Python中的調用方法為sdk.NET_DVR_Cleanup(),在程序結束前使用。
將SDK提供的接口進一步封裝到類(class)里,從而簡化SDK接口,解除上層代碼與SDK之間的耦合關系。由于海康SDK只需初始化一次,故這里將類設計為單例模式,將類的函數設計為靜態函數。
利用上述方法實現了Python語言與海康SDK的聯合開發。用此方法編寫的設備監控應用程序運行良好,為后續系統引入智能識別技術打下了堅實的基礎。