python调用海康sdk操作热成像设备获取对应点温度

您所在的位置:网站首页 矩阵测温 python调用海康sdk操作热成像设备获取对应点温度

python调用海康sdk操作热成像设备获取对应点温度

2024-07-12 13:58| 来源: 网络整理| 查看: 265

python调用海康sdk操作热成像设备获取对应点温度

Python调用海康sdk操作热成像设备获取对应点温度。官方提供sdk的c++版的开发文档自己写对应的Python接口和类。下面的代码示例了通过SDK获取热成像画面上某一点的具体温度。 hCNetSDK = CDLL(‘./libhcnetsdk.so’)是海康sdk的目录,可以是相对路径也可以是绝对路径。 ./sdklog是海康的SDK日志写入的文件夹,如果无法正常得出结果可以看看下面的日志。

实时测温 设备配置好测温规则之后会自动检测配置的点、线或框的温度,实时测温即获取这些规则检测到的温度信息。热成像相关功能配置只支持在热成像通道上实现。热成像重载云台和热成像中载云台设备,有两个通道,第一个通道为可见光通道,第二个通道为热成像通道;热成像单目筒机只有一个通道,为热成像通道。

全屏测温(代码目前实现方式) 全屏测温,可以获取设备输出的探测器的每个像素点的温度信息,可通过抓热图或者全屏测温实时上传方式获取。热成像相关功能配置只支持在热成像通道上实现。热成像重载云台和热成像中载云台设备,有两个通道,第一个通道为可见光通道,第二个通道为热成像通道;热成像单目筒机只有一个通道,为热成像通道。

代码结构如下 代码目录结构

1.dll动态库python函数封装

# coding=utf-8 from ctypes import c_int32, c_char_p, c_void_p, c_float, c_size_t, c_ubyte, c_long, cdll, POINTER, CDLL, c_bool, c_long, c_short from hk_class import * import sys # 回调函数类型定义 hCNetSDK = None; if 'linux' == sys.platform: fun_ctype = CFUNCTYPE hCNetSDK = cdll.LoadLibrary('./lib/libhcnetsdk.so') else: hCNetSDK = CDLL('./lib/HCNetSDK.dll') fun_ctype = WINFUNCTYPE SERIALNO_LEN = 48 # 序列号长度 NAME_LEN = 32 # 用户名长度 # //boolean NET_DVR_Init(); NET_DVR_Init = hCNetSDK.NET_DVR_Init NET_DVR_Init.restype = c_bool NET_DVR_Init.argtypes = () # boolean NET_DVR_Cleanup(); NET_DVR_Cleanup = hCNetSDK.NET_DVR_Cleanup NET_DVR_Cleanup.restype = c_bool NET_DVR_Cleanup.argtypes = () # NativeLong NET_DVR_Login_V30(String sDVRIP, short wDVRPort, String sUserName, String sPassword, NET_DVR_DEVICEINFO_V30 lpDeviceInfo); NET_DVR_Login_V30 = hCNetSDK.NET_DVR_Login_V30 NET_DVR_Login_V30.restype = c_long NET_DVR_Login_V30.argtypes = (c_char_p, c_short, c_char_p, c_char_p, POINTER(NET_DVR_DEVICEINFO_V30)) # boolean NET_DVR_Logout_V30(NativeLong lUserID); NET_DVR_Logout_V30 = hCNetSDK.NET_DVR_Logout_V30 NET_DVR_Logout_V30.restype = c_bool NET_DVR_Logout_V30.argtypes = (c_long,) # boolean NET_DVR_SetSTDConfig(NativeLong lUserID, int dwCommand, NET_DVR_STD_CONFIG lpInConfigParam); NET_DVR_SetSTDConfig = hCNetSDK.NET_DVR_SetSTDConfig NET_DVR_SetSTDConfig.restype = c_bool NET_DVR_SetSTDConfig.argtypes = (c_long, c_int32, NET_DVR_STD_CONFIG) # boolean NET_DVR_GetSTDConfig(NativeLong lUserID, int dwCommand, NET_DVR_STD_CONFIG lpOutConfigParam); NET_DVR_GetSTDConfig = hCNetSDK.NET_DVR_GetSTDConfig NET_DVR_GetSTDConfig.restype = c_bool NET_DVR_GetSTDConfig.argtypes = (c_long, c_int32, NET_DVR_STD_CONFIG) # boolean NET_DVR_CaptureJPEGPicture_WithAppendData(NativeLong lUserID, int lChannel, NET_DVR_JPEGPICTURE_WITH_APPENDDATA lpJpegWithAppend); NET_DVR_CaptureJPEGPicture_WithAppendData = hCNetSDK.NET_DVR_CaptureJPEGPicture_WithAppendData NET_DVR_CaptureJPEGPicture_WithAppendData.restype = c_bool NET_DVR_CaptureJPEGPicture_WithAppendData.argtypes = (c_long, c_int32, POINTER(NET_DVR_JPEGPICTURE_WITH_APPENDDATA)) # int NET_DVR_GetLastError(); NET_DVR_GetLastError = hCNetSDK.NET_DVR_GetLastError NET_DVR_GetLastError.restype = c_int32 NET_DVR_GetLastError.argtypes = () # 启用日志文件写入接口 # boolean NET_DVR_SetLogToFile(int bLogEnable, String strLogDir, boolean bAutoDel); NET_DVR_SetLogToFile = hCNetSDK.NET_DVR_SetLogToFile NET_DVR_SetLogToFile.restype = c_bool NET_DVR_SetLogToFile.argtypes = (c_int32, c_char_p, c_bool) # 单帧数据捕获并保存成JPEG存放在指定的内存空间中。 # BOOL NET_DVR_CaptureJPEGPicture_NEW( # LONG lUserID, # LONG lChannel, # LPNET_DVR_JPEGPARA lpJpegPara, # char *sJpegPicBuffer, # DWORD dwPicSize, # LPDWORD lpSizeReturned # ); NET_DVR_CaptureJPEGPicture_new = hCNetSDK.NET_DVR_CaptureJPEGPicture_NEW NET_DVR_CaptureJPEGPicture_new.restype = c_bool NET_DVR_CaptureJPEGPicture_new.argtypes = (c_long, c_long, POINTER(NET_DVR_JPEGPARA), c_char_p, c_ulong, POINTER(c_ulong)) # BOOL NET_DVR_CaptureJPEGPicture_NEW( # LONG lUserID, # LONG lChannel, # LPNET_DVR_JPEGPARA lpJpegPara, # char *sJpegPicBuffer, # DWORD dwPicSize, # LPDWORD lpSizeReturned # ); NET_DVR_CaptureJPEGPicture = hCNetSDK.NET_DVR_CaptureJPEGPicture NET_DVR_CaptureJPEGPicture.restype = c_bool NET_DVR_CaptureJPEGPicture.argtypes = (c_long, c_long, POINTER(NET_DVR_JPEGPARA), c_char_p) # 码流回调函数 #(DWORD dwType, void* lpBuffer, DWORD dwBufLen, void* pUserData) GetThermInfoCallback = fun_ctype(c_int32, c_void_p, c_int32, c_void_p)

2.结构体python类封装

# coding=utf-8 from ctypes import * SERIALNO_LEN = 48 # 序列号长度 NAME_LEN = 32 # 用户名长度py VCA_MAX_POLYGON_POINT_NUM = 10 #检测区域最多支持10个点的多边形 class NET_DVR_DEVICEINFO_V30(Structure): _fields_ = [('sSerialNumber', c_ubyte * SERIALNO_LEN), ('byAlarmInPortNum', c_byte), ('byAlarmOutPortNum', c_byte), ('byDiskNum', c_byte), ('byDVRType', c_byte), ('byChanNum', c_byte), ('byStartChan', c_byte), ('byAudioChanNum', c_byte), ('byIPChanNum', c_byte), ('byRes1', c_ubyte * 24)] class NET_VCA_POINT(Structure): _fields_ = [('fX', c_float), ('fY', c_float)] class NET_VCA_POLYGON(Structure): _fields_ = [('dwPointNum', c_ulong), ('struPos',NET_VCA_POINT * 10)] class NET_DVR_THERMOMETRY_PRESETINFO_PARAM(Structure): _fields_ = [('byEnabled', c_byte), ('byRuleID', c_short), ('wDistance', c_short), ('fEmissivity', c_float), ('byDistanceUnit', c_byte), ('byRes', c_ubyte * 2), ('byReflectiveEnabled', c_byte), ('fReflectiveTemperature', c_float), ('szRuleName', c_ubyte * NAME_LEN), ('byRes1', c_ubyte * 63), ('byRuleCalibType', c_byte), ('struPoint', NET_VCA_POINT), ('struRegion', NET_VCA_POLYGON)] class NET_DVR_THERMOMETRY_PRESETINFO(Structure): _fields_ = [('dwSize', c_ulong), ('wPresetNo', c_short), ('byRes', c_ubyte * 2), ('struPresetInfo', NET_DVR_THERMOMETRY_PRESETINFO_PARAM * 40)] class NET_DVR_THERMOMETRY_COND(Structure): _fields_ = [('dwSize', c_ulong), ('dwChannel', c_ulong), ('wPresetNo', c_short), ('byRes', c_ubyte * 62)] class BYTE_ARRAY(Structure): _fields_ = [('byValue', c_byte * 2097152)] class NET_DVR_STD_CONFIG(Structure): _fields_ = [('lpCondBuffer', POINTER(NET_DVR_THERMOMETRY_COND)), ('dwCondSize', c_ulong), ('lpInBuffer', POINTER(NET_DVR_THERMOMETRY_PRESETINFO)), ('dwInSize', c_ulong), ('lpOutBuffer', POINTER(NET_DVR_THERMOMETRY_PRESETINFO)), ('dwOutSize', c_ulong), ('lpStatusBuffer', POINTER(BYTE_ARRAY)), ('dwStatusSize', c_ulong), ('lpXmlBuffer', c_void_p), ('dwXmlSize', c_ulong), ('byDataType', c_bool), ('byRes', c_ubyte * 23)] class NET_VCA_RECT(Structure): _fields_ = [('fX', c_char),('fY', c_char),('fWidth', c_char),('fHeight', c_char)] class NET_DVR_JPEGPICTURE_WITH_APPENDDATA(Structure): _fields_ = [('dwSize', c_int32), ('dwChannel', c_int32), ('dwJpegPicLen', c_int32), ('pJpegPicBuff', POINTER(BYTE_ARRAY)), ('dwJpegPicWidth', c_int32), ('dwJpegPicHeight', c_int32), ('dwP2PDataLen', c_int32), ('pP2PDataBuff', POINTER(BYTE_ARRAY)), ('byIsFreezedata', c_byte), ('byRes', c_byte * 255)] # JPEG图像信息结构体。 # struct{ # WORD wPicSize; # WORD wPicQuality; # }NET_DVR_JPEGPARA,*LPNET_DVR_JPEGPARA; class NET_DVR_JPEGPARA(Structure): _fields_ = [('wPicSize', c_ulong),('wPicQuality', c_ulong)] #点坐标参数结构体。 class NET_VCA_POINT(Structure): _fields_ =[('fX',c_float),('fY',c_float)] #点测温实时信息结构体。 class NET_DVR_POINT_THERM_CFG(Structure): _fields_ = [('fTemperature', c_float),('struPoint', NET_VCA_POINT),('byRes', c_byte * 120)] #多边形结构体。 class NET_VCA_POLYGON(Structure): _fields_ = [('dwPointNum',c_uint32), ('struPos', NET_VCA_POINT * VCA_MAX_POLYGON_POINT_NUM)] #框/线测温实时信息结构体。 class NET_DVR_LINEPOLYGON_THERM_CFG(Structure): _fields_ = [('fMaxTemperature', c_float),('fMinTemperature', c_float), ('fAverageTemperature', c_float), ('fTemperatureDiff', c_float),('struRegion', NET_VCA_POLYGON), ('byRes', c_ubyte * 32)] #区域框参数结构体。 class NET_VCA_RECT(Structure): _fields_ = [('fX', c_float), ('fY', c_float), ('fWidth', c_float), ('fHeight', c_float)] # 实时温度信息结构体。 class NET_DVR_THERMOMETRY_UPLOAD(Structure): _fields_ =[('dwSize', c_uint32),('dwRelativeTime', c_uint32),('dwAbsTime', c_uint32),('szRuleName', c_char * NAME_LEN),('byRuleID', c_ubyte),('byRuleCalibType', c_ubyte), ('wPresetNo', c_uint16),('struPointThermCfg', NET_DVR_POINT_THERM_CFG),('struLinePolygonThermCfg', NET_DVR_LINEPOLYGON_THERM_CFG),('byThermometryUnit', c_ubyte), ('byDataType', c_ubyte),('byRes1', c_ubyte),('bySpecialPointThermType', c_ubyte),('fCenterPointTemperature', c_float),('fHighestPointTemperature', c_float), ('fLowestPointTemperature', c_float),('struHighestPoint', NET_VCA_POINT),('struLowestPoint', NET_VCA_POINT),('byIsFreezedata', c_ubyte),('byFaceSnapThermometryEnabled', c_ubyte), ('byRes2[2]', c_ubyte),('dwChan', c_uint32),('struFaceRect', NET_VCA_RECT),('dwTimestamp', c_uint32),('byRes[68]', c_ubyte)] # DWORD|c_uint32 BYTE|c_ubyte WORD|c_int16

3.sdk自封装

import lib.hk_dll as hk_dll import lib.hk_class as hk_class from ctypes import * import struct # from numba import njit # 设备信息 m_strDeviceInfo = None SERIALNO_LEN = 48 # 序列号长度 NAME_LEN = 32 # 用户名长度py point_bytes = (c_byte * 4)() #用户登录信息 m_strDeviceInfo = None #测温信息 m_strJpegWithAppenData = None # 初始化 def init(): return hk_dll.NET_DVR_Init() # 登录 def login(ip, port, username, password): # 注册 m_strDeviceInfo = hk_class.NET_DVR_DEVICEINFO_V30() m_strDeviceInfo.sSerialNumber = (c_ubyte * SERIALNO_LEN)() m_strDeviceInfo.byRes1 = (c_ubyte * 24)() lUserID = hk_dll.NET_DVR_Login_V30(bytes(ip), port, bytes(username), bytes(password), byref(m_strDeviceInfo)) # 打开SDK写日志的功能 hk_dll.NET_DVR_SetLogToFile(3, b'./sdklog', False) return lUserID # 退出登录 def logout(lUserID): hk_dll.NET_DVR_Logout_V30(lUserID) # 释放sdk def cleanup(): hk_dll.NET_DVR_Cleanup() # 获取抓拍图片最高温度 def get_temperature_all(lUserID): ret, m_strJpegWithAppenData = get_temperature0(lUserID) max_temperature = -50 min_temperature = 120 byValue = m_strJpegWithAppenData.pP2PDataBuff.contents.byValue if ret: for x in range(m_strJpegWithAppenData.dwJpegPicWidth): for y in range(m_strJpegWithAppenData.dwJpegPicHeight): temperature = struct.unpack('


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3