python调用海康摄像头_Python实现海康威视SDK二次开发(开源库)

此贴能起到的作用

通过这个帖子,能了解到如何用Python调用海康SDK,实现业务逻辑需要结合哪些资料,这些接口的参数是怎么样的,如何翻译成Python,如何传参,参数中的一些变量,常量可以怎样查找。

开发资源

SDK只有对linux和windows的支持,没有对mac的支持,所以mac开发比较累

基于SDK开发

从官方给到的SDK中有.chm的文件,是一个接口文档,里面详细的介绍了该SDK的所有描述。

SDK中给到了基于Java,C#等demo,但是没有python。(这些demo可以帮我们理解一些比较晦涩难懂的逻辑,但是demo写的也没有很严格,部分变量类型定义不是完全按照文档来的,需要自己消化)

linux和windows的SDK中分别是.so和.dll,对于python我们需要ctypes库来完成二次开发

硬件产品开发文档,这里有详细硬件功能调用链,很详细,不过demo是c++的,另外demo中的一些变量或者常量不能查看引用,所以可以与第一项中提到的文档结合,如果两者描述不符,以当前SDK中的.chm文件优先。

代码实践

目前开源库以更新迭代,以下为原始代码,如果需要用到用到Python开发,可以直接使用开源库。

基础SDK调用实现

from ctypes import *

import os

import logging

import hkws.model.login as login

import hkws.model.preview as preview

from hkws.callback import hikFunc

from hkws.callback import g_real_data_call_back

class HKAdapter:

so_list = []

# 加载目录下所有so文件

def add_lib(self, path, suffix):

files = os.listdir(path)

for file in files:

if not os.path.isdir(path + file):

if file.endswith(suffix):

self.so_list.append(path + file)

else:

self.add_lib(path + file + "/", suffix)

# python 调用 sdk 指定方法

def call_cpp(self, func_name, *args):

for so_lib in self.so_list:

try:

lib = cdll.LoadLibrary(so_lib)

try:

value = eval("lib.%s" % func_name)(*args)

logging.info("调用的库:" + so_lib)

logging.info("执行成功,返回值:" + str(value))

return value

except:

continue

except:

continue

# logging.info("库文件载入失败:" + so_lib )

logging.error("没有找到接口!")

return False

初始化SDK及释放SDK

# 初始化海康微视 sdk

def init_sdk(self):

init_res = self.call_cpp("NET_DVR_Init") # SDK初始化

if init_res:

logging.info("SDK初始化成功")

return True

else:

error_info = self.call_cpp("NET_DVR_GetLastError")

logging.error("SDK初始化错误:" + str(error_info))

return False

# 释放sdk

def sdk_clean(self):

result = self.call_cpp("NET_DVR_Cleanup")

logging.info("释放资源", result)

用户设备登录

请求所用参数,这里需要用python ctypes参照https://open.hikvision.com/hardware/definitions/NET_DVR_Login_V40.html 所给出的结构写出对应的python类,有些常量具体数值是没有的,需要结合之前所说的Java,C#的demo看。

class NET_DVR_USER_LOGIN_INFO(Structure):

_fields_ = [

("sDeviceAddress", c_byte * 129), # 设备地址,IP或者普通域名

("byUseTransport", c_byte), # 是否启用能力透传 0:不启动,默认 1:启动

("wPort", c_uint16), # 设

你可能感兴趣的:(python调用海康摄像头)