TECHNOLOGY AND INFORMATION
IT技术论坛
科学与信息化2021年1月上 53
基于Python与海康SDK的工业设备视频监控系统开发
关兵
丹东东方测控技术股份有限公司 辽宁 丹东 118000
摘 要 本文介绍了使用Python语言及海康威视SDK设计和开发工业设备实时视频监控软件的方法,并给出了示例代码,为后续实现设备状态智能视频识别系统奠定了基础。关键词 Python;海康威视;SDK;Ctypes
前言
海康威视的监控产品在工业企业内应用十分广泛,如何利用海康威视产品实现专有定制化视频监控系统是十分有意义的。Python 语言易学易用,简单高效,但目前海康官方还未提供Python 版SDK 。本文介
绍了在Windows 系统下Python 编程环境中,结合海康威视SDK 设计和开发工业设备实时视频监控软件的方法。
(1)Python 简介。Python 是一种跨平台的计算机程序设计语言。无论是桌面开发序、Web 开发、人工智能、自动化运维、科学运算,Python 都有着丰富的扩展模块,使用Python 开发应用程序,无疑是高效的。
(2)海康SDK 。海康威视SDK 即海康提供的开发包,主要包含设备网络SDK 和播放库SDK (以下简称SDK )。海康威视设备网络SDK 是基于设备私有网络通信协议开发的,为嵌入式网络硬盘录像机、网络摄像机等网络产品服务的配套模块,提供Windows 和Linux 两个版本,用于远程访问和控制设备软件的二次开发[1] 。
1 开发方法
1.1 Ctypes 模块简介
模块Ctypes 是Python 内建的用于调用动态链接库函数的功能模块,一定程度上可以用于Python 与其他语言的混合编程,可以说Ctypes 模块是Python 应用程序与SDK 之间的桥梁。
1.2 DLL 装载
DLL (动态链接库)是Dynamic Link Library 的缩写,在Windows 下Python 环境中使用ctypes.windll.loadLibrary()函数进行DLL 的装载。本例中海康SDK 的DLL 载入方法为:sdk=windll.LoadLibrary("HCNetSDK.dll")。
1.3 数据类型
Ctypes 提供和c 语言兼容的数据类型,可以很方便地调用DLL 中的函数。如Ctypes 中的cbyte 对应c 语言中的char 及Python 中的int/long 。
海康SDK 头文件中包含了大量的结构体,在Python 中,结构体必须继承自Ctypes 模块的Structure 类。每个子类必须定义_fields_属性,该属性是2元素元组的列表,包含字段名和字段类型,其中字段类型必须是Ctypes 类型。
1.4 宏定义
在海康SDK 头文件中存在大量的宏定义,在Python 中可用全局变量来实现。如云台控制:TILT_UP = 21,TILT_DOWN = 22。
1.5 回调函数的定义
回调函数是一个通过函数指针调用的函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用,用于对该事件或条件进行响应。如回调函数的原型为:CMPFUNC = CFUNCTYPE(c_int, POINTER(c_int), POINTER(c_int)) ,第一个参数c_int 表示函数返回值是int 类型。2 接口调用方法
海康SDK 调用流程通常为:初始化SDK ,用户登录,预
览、云台控制等操作,注销设备,释放SDK 资源。
python新手代码userid2.1 初始化SDK
初始化函数用于完成初始内存分配等工作,Python 中调用方法为sdk.NET_DVR_Init()。
2.2 用户登录
用户登录实现用户的注册功能,返回用户ID ,该用户ID 具有唯一性,后续对设备的操作都需要通过此ID 实现。Python 调用方法为,sdk.NET_DVR_Login_V30(sDVRIP, wDVRPort, sUserName, sPassword, Ctypes.byref(DeviceInfo)),byref()用来传递引用参数,DeviceInfo 为设备信息结构体,继承至Ctypes.Structure 。
2.3 视频预览
视频预览模块实现从网络设备取实时码流解码显示以及播放控制等功能,Python 中调用方法为sdk.NET_DVR_RealPlay_V40(lUserID, Ctypes.byref(lpPreviewInfo), callBack, pUser) 。其中lpPreviewInfo 是Ctypes 构造的结构体,结构体中lpPreviewInfo.hPlayWnd = hwnd 为窗口句柄,用于播放图像。
2.4 云台控制
云台控制实现摄像机的镜头方位调整及变焦变倍等操作,P y t h o n 中的调用方法为:s d k.N E T _D V R _PTZControl(lRealHandle, dwPTZCommand, dwStop)。
2.5 报警布防
建立报警通道函数在Python 中调用方法为sdk.NET_DVR_SetupAlarmChan_V41(lUserID, Ctypes.byref(struAlarmParam)),s t r u A l a r m P a r a m 是C t y p e s 构造的报警布放参数结构体。启动布防前,需要调用注册回调函数的接口N E T _D V R _SetDVRMessageCallBack_V30(),注册回调函数的格式为“回调函数实例=回调函数类型(具体回调函数)”,然后将回调函数实例作为参数传给注册接口。
2.6 用户注销
用户注销函数在Python 中的调用方法为sdk.NET_DVR_Logout(lUserID)。
2.7 释放资源
释放资源函数在Python 中的调用方法为sdk.NET_DVR_Cleanup(),在程序结束前使用。
2.8 类的封装
将SDK 提供的接口进一步封装到类(class )里,从而简化SDK 接口,解除上层代码与SDK 之间的耦合关系。由于海康SDK 只需初始化一次,故这里将类设计为单例模式,将类的函数设计为静态函数。
3 结束语
利用上述方法实现了Python 语言与海康SDK 的联合开发。用此方法编写的设备监控应用程序运行良好,为后续系统引入智能识别技术打下了坚实的基础。参考文献
[1] 陈俊良,葛俊锋,叶林,等.基于海康威视SDK 的视频监控软件的开发[J].工业控制计算机,2015(7):97-101.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论