海康相机开发---HCNetSDK

HCNetSDK(Hikvision Network Software Development Kit)是海康威视专为旗下安防监控设备打造的二次开发工具包,是连接上层应用与海康设备的核心桥梁。其封装了设备底层通信协议(包括私有协议与部分标准协议),提供标准化API接口,使开发者无需深入理解设备硬件细节即可实现对监控设备的全功能控制。

一、HCNetSDK的核心作用与技术定位

在安防监控系统架构中,HCNetSDK的核心价值在于打破设备与应用之间的通信壁垒,实现“设备功能标准化调用”。其具体作用体现在以下四个层面:

1. 设备兼容性支撑

海康威视的设备生态覆盖网络摄像机(IPC)、硬盘录像机(DVR)、网络录像机(NVR)、球机、门禁设备等,不同设备的底层通信协议存在差异(如IPC侧重网络流传输,DVR侧重本地存储控制)。HCNetSDK通过统一接口抽象,屏蔽了设备类型差异,开发者只需调用相同接口即可实现对不同设备的控制(如通过NET_DVR_RealPlay_V30同时支持IPC和DVR的实时预览)。

2. 功能完整性覆盖

监控系统的核心需求(设备管理、实时监控、录像回放、云台控制、报警处理等)均通过SDK接口实现,且支持海康设备的特有功能(如Smart IR智能红外、宽动态调节、智能行为分析等)。相比通用协议(如ONVIF),HCNetSDK能更深度地调用设备能力(如ONVIF仅支持基础功能,而SDK可控制设备的私有参数)。

3. 开发效率提升

SDK提供了完整的接口文档、数据结构定义及示例代码,开发者无需从零构建通信协议解析逻辑。例如,设备登录流程中,SDK已封装了身份认证、加密握手等底层操作,开发者只需调用NET_DVR_Login_V30并传入IP、端口、账号密码即可完成登录。

4. 跨平台与多语言支持

HCNetSDK支持Windows(32/64位)、Linux(x86/ARM)、Android、iOS等主流平台,并提供C/C++、C#、Java等语言的接口(C/C++为原生接口,其他语言通过封装实现)。其中,C/C++接口性能最优,是对实时性、稳定性要求高的场景(如大型安防平台)的首选。

二、核心功能模块与关键接口详解

HCNetSDK的功能模块按“系统交互流程”划分,涵盖从初始化到资源释放的全生命周期,每个模块包含若干核心接口,以下为详细解析:

模块1:SDK基础初始化与配置

核心作用:完成SDK的初始化、资源分配、全局参数配置,是所有操作的前置步骤。

接口名功能描述关键参数与返回值
NET_DVR_Init初始化SDK,分配内存与线程资源返回BOOLTRUE表示成功,FALSE失败(需通过NET_DVR_GetLastError()获取错误码)
NET_DVR_Cleanup释放SDK资源,程序退出前必须调用无参数,返回BOOLTRUE表示释放成功
NET_DVR_SetConnectTime设置SDK与设备的连接超时时间(默认3000ms)dwWaitTime:超时时间(ms);dwTryTimes:重试次数;返回BOOL
NET_DVR_SetLogToFile开启SDK日志功能(用于调试)bLogEnable:是否开启;strLogDir:日志保存路径;bAutoDel:是否自动删除旧日志
NET_DVR_GetSDKVersion获取当前SDK版本号(用于版本兼容性校验)返回DWORD:版本号(如5.3.0.20对应0x05030014

使用示例

// 初始化SDK并配置日志
if (!NET_DVR_Init()) {printf("SDK初始化失败,错误码:%d\n", NET_DVR_GetLastError());return -1;
}
// 设置连接超时时间为5秒,重试2次
NET_DVR_SetConnectTime(5000, 2);
// 开启日志(保存到D盘,自动删除7天前日志)
NET_DVR_SetLogToFile(TRUE, "D:\\HCNetSDK_Log", TRUE);
模块2:设备发现与管理

核心作用:实现设备的网络发现、登录、信息查询与状态管理,是设备交互的基础。

2.1 设备发现接口
接口名功能描述关键参数与返回值
NET_DVR_DeviceSearch基于广播/组播搜索局域网内的海康设备(支持IPC、DVR、NVR等)lpSearchCond:搜索条件(如设备类型);lpDeviceInfo:输出设备列表;返回找到的设备数量
NET_DVR_StartFindDevice异步搜索设备(适合大规模设备场景,通过回调返回结果)pFindDeviceCond:搜索条件;pUserData:用户数据;返回搜索句柄LONG
NET_DVR_StopFindDevice停止异步搜索输入搜索句柄,返回BOOL

设备信息结构体NET_DVR_DEVICEINFO_V30包含设备IP、端口、型号、序列号、固件版本等关键信息,是后续登录的基础。

2.2 设备登录与注销
接口名功能描述关键参数与返回值
NET_DVR_Login_V30登录设备(最常用接口,支持密码加密传输)sDVRIP:设备IP;wDVRPort:端口(默认8000);sUserName/sPassword:账号密码;lpDeviceInfo:输出设备信息;返回LONG:用户ID(lUserID,后续操作的唯一标识,<0表示失败)
NET_DVR_LoginWithHighLevelSecurity高安全性登录(支持证书加密,适合对安全性要求高的场景)增加pSecurity参数(安全配置),其他同Login_V30
NET_DVR_Logout注销登录,释放设备连接资源输入lUserID,返回BOOL

登录失败常见错误码101(用户名或密码错误)、107(连接超时,网络不通)、113(设备不支持该SDK版本)。

2.3 设备信息查询
接口名功能描述关键参数与返回值
NET_DVR_GetDVRConfig获取设备配置(如网络参数、图像参数、录像计划等)lUserID:用户ID;dwCommand:配置类型(如NET_DVR_GET_NETCFG获取网络配置);lChannel:通道号(-1表示设备级配置);lpOutBuffer:输出配置数据;返回BOOL
NET_DVR_GetDeviceAbility获取设备能力集(设备支持的功能列表,如是否支持H.265、是否带云台等)lUserID:用户ID;dwAbilityType:能力类型;lpAbility:输出能力集;返回BOOL

示例:查询设备网络配置

NET_DVR_NETCFG_V30 netCfg = {0};
DWORD dwBufLen = sizeof(NET_DVR_NETCFG_V30);
// 获取设备级网络配置(通道号-1)
if (!NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_NETCFG, -1, &netCfg, dwBufLen, &dwBufLen)) {printf("获取网络配置失败,错误码:%d\n", NET_DVR_GetLastError());
} else {printf("设备IP:%s\n", netCfg.sIpAddr);printf("子网掩码:%s\n", netCfg.sSubNetMask);
}
模块3:实时预览与视频流处理

核心作用:获取设备的实时视频流并实现显示、录像、抓图等功能,是监控系统的核心模块。

3.1 实时预览接口
接口名功能描述关键参数与返回值
NET_DVR_RealPlay_V30启动实时预览(支持回调取流或句柄显示)lUserID:用户ID;lpPreviewInfo:预览参数(通道号、窗口句柄、回调函数等);返回LONG:预览句柄(lRealHandle,<0表示失败)
NET_DVR_StopRealPlay停止实时预览输入lRealHandle,返回BOOL
NET_DVR_SaveRealData将实时流保存为本地文件(如MP4)lRealHandle:预览句柄;sFileName:保存路径;返回BOOL

预览参数结构体NET_DVR_PREVIEWINFO的关键字段:

  • lChannel:通道号(IPC通常为1,DVR/NVR为录像通道);
  • hPlayWnd:播放窗口句柄(NULL表示只取流不显示);
  • fSourceDataCallBack:码流回调函数(获取原始H.264/H.265码流);
  • fDisplayCallBack:解码回调函数(获取解码后的RGB/YUV数据,用于自定义渲染)。
3.2 视频流回调与处理

实时预览的核心是通过回调函数获取视频数据,示例回调函数定义:

// 码流回调函数(获取原始H.264/H.265数据)
void CALLBACK RealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void *pUser) {if (dwDataType == NET_DVR_SYSHEAD) {// 系统头数据(包含码流参数,如分辨率、帧率)// 可在此初始化解码器} else if (dwDataType == NET_DVR_STREAMDATA) {// 视频流数据(H.264/H.265裸流)// 可发送给解码器或保存到文件}
}

解码渲染:海康提供PlayCtrl.dll辅助解码,通过PlayM4_OpenStreamPlayM4_Play可快速实现视频显示:

// 在码流回调中调用解码
if (dwDataType == NET_DVR_SYSHEAD) {// 初始化解码器PlayM4_OpenStream(hPlayHandle, pBuffer, dwBufSize, 1024*1024);PlayM4_Play(hPlayHandle, hWnd); // hWnd为显示窗口句柄
} else if (dwDataType == NET_DVR_STREAMDATA) {// 送入码流解码PlayM4_InputData(hPlayHandle, pBuffer, dwBufSize);
}
模块4:录像管理与回放

核心作用:实现设备录像的查询、本地/远程回放、下载与管理,支持按时间、通道、类型筛选。

4.1 录像查询
接口名功能描述关键参数与返回值
NET_DVR_SearchFile_V30按条件查询设备上的录像文件lUserID:用户ID;lpSearchCond:查询条件(通道、开始/结束时间、录像类型);lpFileInfo:输出文件列表;返回找到的文件数量
NET_DVR_SearchFileByTimeEx扩展查询(支持按事件类型筛选,如移动侦测录像)增加事件类型参数,其他同SearchFile_V30

录像类型枚举0(定时录像)、1(移动侦测)、2(报警触发)、3(手动录像)等。

4.2 录像回放与控制
接口名功能描述关键参数与返回值
NET_DVR_PlayBackByTime_V40按时间范围启动远程回放lUserID:用户ID;lpPlayBackTime:回放时间范围;返回LONG:回放句柄(lPlayBackHandle
NET_DVR_PlayBackControl控制回放(暂停、快进、拖动等)lPlayBackHandle:回放句柄;dwControlCode:控制命令(如NET_DVR_PLAYBACK_PAUSE暂停);返回BOOL
NET_DVR_StopPlayBack停止回放输入lPlayBackHandle,返回BOOL

示例:回放指定时间的录像

NET_DVR_PLAYBACK_TIME playTime = {0};
// 设置回放时间(2023-10-01 00:00:00 至 00:05:00)
playTime.stStartTime.dwYear = 2023;
playTime.stStartTime.dwMonth = 10;
// ... 省略其他时间参数
playTime.lChannel = 1; // 通道1LONG lPlayBackHandle = NET_DVR_PlayBackByTime_V40(lUserID, &playTime);
if (lPlayBackHandle < 0) {printf("回放启动失败,错误码:%d\n", NET_DVR_GetLastError());
} else {// 5秒后暂停回放Sleep(5000);NET_DVR_PlayBackControl(lPlayBackHandle, NET_DVR_PLAYBACK_PAUSE, 0, NULL);
}
4.3 录像下载
接口名功能描述关键参数与返回值
NET_DVR_GetFileByTime_V30按时间范围下载录像文件lUserID:用户ID;lpTimeParam:时间范围;sSavedFileName:保存路径;返回LONG:下载句柄
NET_DVR_StopGetFile停止下载输入下载句柄,返回BOOL
NET_DVR_GetDownloadPos获取下载进度(0-100)输入下载句柄;pdwPos:输出进度;返回BOOL
模块5:云台控制

核心作用:控制带云台的设备(如球机)进行转动、变焦、聚焦等操作,支持Pelco-D/P等协议及海康私有指令。

接口名功能描述关键参数与返回值
NET_DVR_PTZControlWithSpeed发送云台控制命令(支持速度调节)lUserID:用户ID;lChannel:通道号;dwPTZCommand:控制命令(如PTZ_UP上转);dwSpeed:速度(1-7,值越大越快);返回BOOL
NET_DVR_PTZPreset设置或调用预置点(将当前云台位置保存为预置点,或直接调用)lUserID:用户ID;lChannel:通道号;dwPresetCmd:命令(SET_PRESET设置/GOTO_PRESET调用);dwPresetIndex:预置点编号;返回BOOL
NET_DVR_PTZPattern启动/停止巡航轨迹(按预设路径自动转动)lUserID:用户ID;lChannel:通道号;dwPatternCmd:命令(START_PATTERN启动/STOP_PATTERN停止);返回BOOL

常用PTZ命令枚举

  • PTZ_UP(0x0001):上转;PTZ_DOWN(0x0002):下转;
  • PTZ_LEFT(0x0004):左转;PTZ_RIGHT(0x0008):右转;
  • PTZ_ZOOM_IN(0x0010):变焦(拉近);PTZ_ZOOM_OUT(0x0020):变焦(拉远);
  • PTZ_FOCUS_NEAR(0x0040):聚焦(近);PTZ_FOCUS_FAR(0x0080):聚焦(远)。
模块6:报警处理

核心作用:接收设备上报的报警信息(如移动侦测、遮挡、异常),并实现报警联动(如弹窗、录像)。

6.1 报警布防与回调
接口名功能描述关键参数与返回值
NET_DVR_SetDVRMessageCallBack_V30注册报警回调函数(设备报警时自动触发)fMessageCallBack:回调函数;pUser:用户数据;返回BOOL
NET_DVR_SetupAlarmChan_V30对指定通道布防(开启报警接收)lUserID:用户ID;lChannel:通道号;返回LONG:布防句柄(lAlarmHandle
NET_DVR_CloseAlarmChan_V30撤防(关闭报警接收)输入lAlarmHandle,返回BOOL

报警回调函数示例

void CALLBACK AlarmMessageCallBack(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void *pUser) {// lCommand:报警类型(如`NET_DVR_ALARM_MOTION_DETECT`移动侦测)// pAlarmer:报警设备信息(IP、通道等)// pAlarmInfo:报警详情(时间、事件等)printf("设备 %s 通道 %d 触发报警,类型:%d\n", pAlarmer->sDeviceIP, pAlarmer->lChannel, lCommand);
}
6.2 常见报警类型
  • NET_DVR_ALARM_MOTION_DETECT(0x0001):移动侦测报警;
  • NET_DVR_ALARM_VIDEO_LOSS(0x0002):视频丢失报警;
  • NET_DVR_ALARM_VIDEO_BLIND(0x0003):视频遮挡报警;
  • NET_DVR_ALARM_HARD_DISK_ERR(0x0004):硬盘错误报警。
模块7:系统配置与参数修改

核心作用:修改设备的网络、图像、录像等配置参数,需管理员权限。

接口名功能描述关键参数与返回值
NET_DVR_SetDVRConfig设置设备配置(与GetDVRConfig对应)lUserID:用户ID;dwCommand:配置类型(如NET_DVR_SET_NETCFG设置网络);lChannel:通道号;lpInBuffer:输入配置数据;返回BOOL
NET_DVR_RebootDVR重启设备(修改部分配置后需重启生效)lUserID:用户ID;返回BOOL

示例:修改设备IP地址

NET_DVR_NETCFG_V30 netCfg = {0};
// 先获取当前配置
NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_NETCFG, -1, &netCfg, sizeof(netCfg), NULL);
// 修改IP为192.168.1.65
strcpy(netCfg.sIpAddr, "192.168.1.65");
// 应用新配置
if (NET_DVR_SetDVRConfig(lUserID, NET_DVR_SET_NETCFG, -1, &netCfg, sizeof(netCfg))) {printf("IP修改成功,重启生效\n");NET_DVR_RebootDVR(lUserID); // 重启设备
}

三、C/C++开发全流程实践

1. 开发环境搭建
Windows环境(VS2022为例)
  • 库文件准备:从海康官网下载SDK,解压后获取HCNetSDK.h(头文件)、HCNetSDK.lib(导入库)、HCNetSDK.dll(动态库)及PlayCtrl.dll(解码库)。
  • 项目配置
    1. 头文件路径:项目属性→C/C++→常规→附加包含目录→添加SDK头文件所在文件夹;
    2. 库文件路径:项目属性→链接器→常规→附加库目录→添加HCNetSDK.lib所在文件夹;
    3. 导入库:项目属性→链接器→输入→附加依赖项→添加HCNetSDK.lib
    4. 动态库部署:将HCNetSDK.dllPlayCtrl.dll复制到可执行文件目录(或系统目录)。
Linux环境(Ubuntu为例)
  • 库文件:获取libhcnetsdk.so(SDK库)、libPlayCtrl.so(解码库);
  • 编译选项:编译时需指定库路径(-L/path/to/libs)和库名(-lhcnetsdk -lPlayCtrl),并添加-fPIC(位置无关代码)。
2. 完整开发流程示例

以下为一个“设备登录→实时预览→云台控制→退出”的完整流程代码:

#include <stdio.h>
#include <windows.h>
#include "HCNetSDK.h"
#include "PlayM4.h"// 全局变量
LONG lUserID = -1;       // 设备登录ID
LONG lRealHandle = -1;   // 预览句柄
HWND hPlayWnd = NULL;    // 播放窗口句柄// 码流回调函数
void CALLBACK RealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void *pUser) {static LONG hPlayHandle = -1; // 解码器句柄if (dwDataType == NET_DVR_SYSHEAD) {// 初始化解码器if (hPlayHandle == -1) {hPlayHandle = PlayM4_OpenStream(0, pBuffer, dwBufSize, 1024*1024);PlayM4_Play(hPlayHandle, hPlayWnd);}} else if (dwDataType == NET_DVR_STREAMDATA) {// 送入码流解码PlayM4_InputData(hPlayHandle, pBuffer, dwBufSize);}
}int main() {// 1. 初始化SDKif (!NET_DVR_Init()) {printf("SDK初始化失败,错误码:%d\n", NET_DVR_GetLastError());return -1;}// 2. 登录设备NET_DVR_DEVICEINFO_V30 deviceInfo = {0};lUserID = NET_DVR_Login_V30("192.168.1.64", 8000, "admin", "12345", &deviceInfo);if (lUserID < 0) {printf("登录失败,错误码:%d\n", NET_DVR_GetLastError());NET_DVR_Cleanup();return -1;}printf("登录成功,用户ID:%d\n", lUserID);// 3. 启动实时预览NET_DVR_PREVIEWINFO previewInfo = {0};previewInfo.lChannel = 1;                  // 通道1previewInfo.hPlayWnd = hPlayWnd;           // 窗口句柄(NULL表示仅取流)previewInfo.fSourceDataCallBack = RealDataCallBack; // 码流回调previewInfo.dwStreamType = 0;              // 主码流lRealHandle = NET_DVR_RealPlay_V30(lUserID, &previewInfo, NULL, NULL);if (lRealHandle < 0) {printf("预览失败,错误码:%d\n", NET_DVR_GetLastError());NET_DVR_Logout(lUserID);NET_DVR_Cleanup();return -1;}printf("预览启动成功,预览句柄:%d\n", lRealHandle);// 4. 云台控制(向上转动2秒)printf("控制云台向上转动...\n");NET_DVR_PTZControlWithSpeed(lUserID, 1, PTZ_UP, 3); // 速度3Sleep(2000);NET_DVR_PTZControlWithSpeed(lUserID, 1, PTZ_STOP, 0); // 停止// 5. 等待用户输入后退出printf("按任意键退出...\n");getchar();// 6. 资源释放NET_DVR_StopRealPlay(lRealHandle);   // 停止预览NET_DVR_Logout(lUserID);             // 注销登录NET_DVR_Cleanup();                   // SDK反初始化printf("程序退出\n");return 0;
}
3. 关键开发技巧与问题处理
(1)多线程与异步操作
  • 实时预览、报警回调等操作会在SDK内部线程中执行,需避免在回调中进行耗时操作(如UI更新),建议通过消息队列异步处理。
  • 批量设备管理(如同时登录100台设备)需使用多线程,每个线程负责一个设备的交互,避免单线程阻塞。
(2)断线重连机制

设备网络中断后,lUserID会失效,需实现重连逻辑:

// 检查连接状态
BOOL IsDeviceConnected(LONG lUserID) {NET_DVR_DEVICEINFO_V30 info = {0};return NET_DVR_GetDVRConfig(lUserID, NET_DVR_GET_DEVICEINFO, -1, &info, sizeof(info), NULL);
}// 重连函数
LONG ReconnectDevice(const char* sIP, WORD wPort, const char* sUser, const char* sPwd) {NET_DVR_Logout(lUserID); // 先注销旧连接return NET_DVR_Login_V30(sIP, wPort, sUser, sPwd, NULL);
}
(3)错误码排查

SDK所有接口失败后,均需通过NET_DVR_GetLastError()获取错误码,常见错误及解决方案:

  • 100:SDK未初始化(需先调用NET_DVR_Init);
  • 105:设备用户数达到上限(需注销其他连接);
  • 127:设备不支持该功能(检查设备型号与SDK版本);
  • 235:码流加密(需在设备端关闭加密或传入密钥)。
(4)性能优化
  • 预览时优先使用子码流(dwStreamType=1)降低带宽占用;
  • 批量操作(如批量下载录像)需控制并发数,避免设备压力过大;
  • 释放资源时严格按“停止操作→注销登录→反初始化”顺序执行,避免句柄泄露。

HCNetSDK作为海康监控设备二次开发的核心工具,其功能覆盖了设备管理、实时监控、录像回放、云台控制、报警处理等全场景需求。通过标准化接口封装,大幅降低了开发门槛,使开发者可聚焦于业务逻辑实现。

在C/C++开发中,需重点关注:

  1. 初始化与资源释放的严格顺序;
  2. 回调函数的线程安全处理;
  3. 错误码的及时排查与处理;
  4. 断线重连等稳定性机制的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97592.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建无广告私人图书馆Reader与cpolar让电子书库随身携带

文章目录前言&#xff1a;告别书荒&#xff0c;拯救灵魂的“摸鱼神器”1、关于Reader&#xff1a;小而美的开源在线阅读器2、Docker部署3、简单使用reader和添加书源4.群晖安装Cpolar工具5.创建reader阅读器的公网地址6.配置固定公网地址前言&#xff1a;告别书荒&#xff0c;拯…

amd cpu是x86架构吗

是的&#xff0c;AMD CPU属于x86架构‌&#xff0c;其64位扩展&#xff08;x86-64&#xff09;最初由AMD设计并成为行业标准。‌ ‌AMD与x86架构的关系‌ ‌技术渊源‌&#xff1a;AMD自1976年起通过技术授权成为x86架构的合法制造商&#xff0c;与英特尔共同主导x86市场。2003…

vercel上线资源无法加载

背景&#xff1a;在本地跑开发服务器没问题&#xff0c;但是部署到 vercel 上就有问题上一次出现类似问题是在更新游戏引擎方法后本地可以跑但是上线没有成功&#xff0c;当时是因为 runner.html 是在部署时通过脚本从远端仓库拉取的&#xff0c;所以解决方案&#xff1a;1.更新…

Node.js 的模块化规范是什么?CommonJS 和 ES6 模块有什么区别?

目录 一、为什么需要模块化&#xff1f; 二、Node.js 的模块化规范 三、CommonJS 模块化 1. 基本语法 2. 特点 3. 缺点 四、ES6 模块&#xff08;ESM&#xff09; 1. 基本语法 2. 特点 3. 在 Node.js 中的使用 五、CommonJS 和 ES6 模块的区别 六、实际开发中的选择…

设计模式:代理模式(Proxy Pattern)

文章目录一、代理模式的定义二、实例分析三、示例代码一、代理模式的定义 代理模式是一种结构型设计模式&#xff0c;它为某个对象提供一个代理或占位符&#xff0c;以控制对这个对象的访问。简单来说代理对象在客户端和目标对象之间起到中介作用&#xff0c;客户端并不会直接操…

数据类型序列化-封装

/// <summary> /// 定义泛型接口 /// </summary> /// <typeparam name"T">T</typeparam> public interface ISettingValue<T> {/// <summary>/// value/// </summary>T DoubleValue { get; }/// <summary>/// key//…

PitVis-2023挑战赛:内镜下垂体瘤手术视频中的手术流程识别|文献速递-深度学习人工智能医疗图像

Title题目PitVis-2023 challenge: Workflow recognition in videos of endoscopic pituitary surgeryPitVis-2023挑战赛&#xff1a;内镜下垂体瘤手术视频中的手术流程识别01文献速递介绍内镜视觉挑战赛与PitVis-2023挑战赛背景及核心内容 “内镜视觉&#xff08;EndoVis&#…

2025年8月个人工作生活总结

本文为 2025年8月工作生活总结。研发编码 无处不在的AI 现在很多地方都在推AI&#xff0c;广西的人工智能走在前列&#xff0c;要赋能各行各业。至于我&#xff0c;主要就是在写点代码&#xff0c;写点交差的文档。其实现在我已经有点分析哪些代码哪些文字是AI写的了。我工作用…

Dubbo常见面试题

1、默认使用的是什么通信框架&#xff0c;还有别的选择吗? 默认也推荐使用netty框架&#xff0c;还有mina。 2、服务调用是阻塞的吗&#xff1f; 默认是阻塞的&#xff0c;可以异步调用&#xff0c;没有返回值的可以这么做。 3、一般使用什么注册中心&#xff1f;还有别的…

简单的加密算法

// 加密函数&#xff08;32位版本&#xff09; //这里的 data 是ID&#xff0c; dword encrypt(dword data, dword key, int shift) {data ^ key; // 第一步&#xff1a;异或混淆// 循环左移&#xff08;shift范围1-31&#xff09;return (data << sh…

升级的MS9125S USB投屏控制芯片(VGAHD输出)

MS9125S是一款USB单芯片投屏器&#xff0c;内部集成了USB 2.0控制器和数据收发模块、视频DAC、HD接口和音视频处理模块&#xff0c;支持压缩视频传输。MS9125S可以通过USB接口显示或者扩展PC、智能手机、平板电脑的显示信息到更大尺寸的显示设备上&#xff0c;支持VGA和HD视频接…

求欧拉回路:Hierholzer算法图解模拟

代码模板&#xff1a;List<Integer> resultList new ArrayList<>();List<Integer> hierholzer() {dfs(0);resultList.add(0);// 数组反转Collections.reverse(resultList);return resultList; }void dfs(int start) {for(int end : G[start]) {if(!vis[star…

Kafka面试精讲 Day 2:Topic、Partition与Replica机制

【Kafka面试精讲 Day 2】Topic、Partition与Replica机制 在“Kafka面试精讲”系列的第二天&#xff0c;我们将深入剖析Kafka最核心的三大数据组织机制&#xff1a;Topic&#xff08;主题&#xff09;、Partition&#xff08;分区&#xff09;与Replica&#xff08;副本&#x…

【备战2025数模国赛】(三)数模常见赛题类型及解决办法

在进行数学建模竞赛时&#xff0c;很多同学面临的第一个挑战是如何对赛题进行归类&#xff0c;并选择合适的模型。本篇梳理了数学建模中最常见的几类赛题&#xff0c;并针对每类题型提供了基本的解决思路&#xff0c;帮助大家快速选择合适的解题方法&#xff0c;高效完成模型构…

LabVIEW测斜设备承压试验台

为保障煤矿井下地质勘探钻孔中测斜装备的可靠运行&#xff0c;设计基于 LabVIEW的钻孔测斜设备承压性能试验台。该试验台以气动增压泵为压力执行元件&#xff0c;结合虚拟仪器与 PLC 控制技术&#xff0c;可精准模拟井下压力环境&#xff0c;完成水压、疲劳等试验&#xff0c;实…

四、练习1:Git基础操作

练习1&#xff1a;Git基础操作 练习目标 通过实际操作掌握Git的基本命令&#xff0c;包括初始化仓库、添加文件、提交更改等。 练习步骤 步骤1&#xff1a;环境准备 确保已安装Git配置用户信息&#xff08;如果未配置&#xff09; # 检查Git版本 git --version# 配置用户信息 g…

RK3399内核驱动实战:获取设备号控制LED的四种方法(由浅入深、代码注释详尽)

RK3399 内核驱动实战&#xff1a;获取设备号控制 LED 的四种方法&#xff08;由浅入深、代码注释详尽&#xff09; 在 Linux 字符设备驱动开发中&#xff0c;设备号&#xff08;major minor&#xff09;是内核与用户空间沟通的桥梁。文章围绕设备号这一条线展开&#xff0c;从…

2025年AI智能体开源技术栈全面解析:从基础框架到垂直应用

2025年&#xff0c;开源AI智能体技术正以前所未有的速度重塑人工智能领域&#xff0c;从单一任务处理到复杂多智能体协作&#xff0c;开源生态已成为技术创新的核心驱动力。一、开源AI智能体生态概述 1.1 技术演进与发展历程 AI智能体技术经历了从规则式智能体&#xff08;2015…

Empire: LupinOne靶场渗透

Empire: LupinOne 来自 <https://www.vulnhub.com/entry/empire-lupinone,750/#top> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.128&#xff0c;靶场IP192.16…

飞腾2000+/64核 PCIE扫描异常问题排查

1、背景介绍近期项目中采用全国产飞腾计算模块搭配一块FPGA模块&#xff08;FPGA为复旦微的VU9P&#xff09;&#xff0c;实现业务数据的收发。FPGA中采用了Xilinx的XDMA IP核&#xff0c;飞腾计算模块中的FT2000/64核处理器通过PEU1的一路 PCIE3.0x8与VU9P相连接&#xff0c;发…