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