166VS2022调试通过海康人脸抓拍SDK的C++代码
Posted zhangchao19890805
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了166VS2022调试通过海康人脸抓拍SDK的C++代码相关的知识,希望对你有一定的参考价值。
具体的开发环境配置方法可以参考 【160】VS2022调试通过海康摄像头烟火识别SDK
下面是人脸抓拍的C++代码,把原来示例中的CreateFile函数改成了CreateFileA函数,避免出现无法创建文件的BUG。具体原因可以参考 【164】VS2022下VC++调用CreateFile文件名不能接受char*,包括强制转换成LPCWSTR的char*也会出错
#include <stdio.h>
#include <iostream>
#include "Windows.h"
#include "HCNetSDK.h"
using namespace std;
//时间解析宏定义
#define GET_YEAR(_time_) (((_time_)>>26) + 2000)
#define GET_MONTH(_time_) (((_time_)>>22) & 15)
#define GET_DAY(_time_) (((_time_)>>17) & 31)
#define GET_HOUR(_time_) (((_time_)>>12) & 31)
#define GET_MINUTE(_time_) (((_time_)>>6) & 63)
#define GET_SECOND(_time_) (((_time_)>>0) & 63)
void CALLBACK cbMessageCallback(LONG lCommand, NET_DVR_ALARMER* pAlarmer, char* pAlarmInfo, DWORD dwBufLen, void* pUser)
NET_DVR_ALARMINFO_V30* netDvrAlarminfoV30 = NULL;
size_t length = strlen(pAlarmInfo);
switch (lCommand)
case COMM_UPLOAD_FACESNAP_RESULT: //人脸抓拍报警信息
NET_VCA_FACESNAP_RESULT struFaceSnap = 0 ;
memcpy(&struFaceSnap, pAlarmInfo, sizeof(NET_VCA_FACESNAP_RESULT));
NET_DVR_TIME struAbsTime = 0 ;
struAbsTime.dwYear = GET_YEAR(struFaceSnap.dwAbsTime);
struAbsTime.dwMonth = GET_MONTH(struFaceSnap.dwAbsTime);
struAbsTime.dwDay = GET_DAY(struFaceSnap.dwAbsTime);
struAbsTime.dwHour = GET_HOUR(struFaceSnap.dwAbsTime);
struAbsTime.dwMinute = GET_MINUTE(struFaceSnap.dwAbsTime);
struAbsTime.dwSecond = GET_SECOND(struFaceSnap.dwAbsTime);
//保存抓拍场景图片
if (struFaceSnap.dwBackgroundPicLen > 0 && struFaceSnap.pBuffer2 != NULL)
char cFilename[256] = 0 ;
HANDLE hFile;
DWORD dwReturn;
char chTime[128];
sprintf_s(chTime, "%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d", struAbsTime.dwYear, struAbsTime.dwMonth, struAbsTime.dwDay, struAbsTime.dwHour, struAbsTime.dwMinute, struAbsTime.dwSecond);
// sprintf_s(cFilename, "FaceSnapBackPic[%s][%s].jpg", struFaceSnap.struDevInfo.struDevIP.sIpV4, chTime);
sprintf_s(cFilename, "D:\\\\yourfolder\\\\FaceSnapBackPic[%s][%s].jpg", struFaceSnap.struDevInfo.struDevIP.sIpV4, chTime);
hFile = CreateFileA(cFilename, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
cout << "hFile INVALID_HANDLE_VALUE" << endl;
break;
WriteFile(hFile, struFaceSnap.pBuffer2, struFaceSnap.dwBackgroundPicLen, &dwReturn, NULL);
CloseHandle(hFile);
hFile = INVALID_HANDLE_VALUE;
cout << "FaceCaptureAlarm" << endl;
// printf("人脸抓拍报警[0x%x]: Abs[%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d] Dev[ip:%s,port:%d,ivmsChan:%d] \\n", \\
// lCommand, struAbsTime.dwYear, struAbsTime.dwMonth, struAbsTime.dwDay, struAbsTime.dwHour, \\
// struAbsTime.dwMinute, struAbsTime.dwSecond, struFaceSnap.struDevInfo.struDevIP.sIpV4, \\
// struFaceSnap.struDevInfo.wPort, struFaceSnap.struDevInfo.byIvmsChannel);
break;
case COMM_VCA_ALARM: // 0x4993 智能检测通用报警(Json或者XML数据结构)
cout << endl;
cout << "BEGIN COMM_VCA_ALARM" << endl;
cout << pAlarmInfo << endl;
cout << "END COMM_VCA_ALARM" << endl;
cout << endl;
break;
case COMM_ALARM_V30:
// dwAlarmType
// 报警类型:0 - 信号量报警,1 - 硬盘满,2 - 信号丢失,3 - 移动侦测,4 - 硬盘未格式化,5 - 读写硬盘出错,
// 6 - 遮挡报警,7 - 制式不匹配,8 - 非法访问,9 - 视频信号异常,10 - 录像 / 抓图异常,11 - 智能场景变化,12 - 阵列异常,
// 13 - 前端 / 录像分辨率不匹配,15 - 智能侦测,16 - POE供电异常,17 - 闪光灯异常,18 - 磁盘满负荷异常报警,19 - 音频丢失,
// 23 - 脉冲报警,24 - 人脸库硬盘异常,25 - 人脸库变更,26 - 人脸库图片变更
netDvrAlarminfoV30 = (NET_DVR_ALARMINFO_V30*)pAlarmInfo;
cout << "COMM_ALARM_V30 " << "pAlarmInfo.dwAlarmType=" << netDvrAlarminfoV30->dwAlarmType << endl;
break;
default:
printf("其他报警,报警信息类型: 0x%x\\n", lCommand);
break;
return;
//int main()
// RyUtils::charTo01('啊');
//
int main(int argc, char* argv[])
cout << "The program starts." << endl;
if (argc < 2)
cout << "NoIP" << endl;
return 0;
char* ip = argv[1];
cout << ip << endl;
//---------------------------------------
// 初始化
NET_DVR_Init();
// 初始化后开始记录日志
char arr[] = "D:\\\\your_log_dir\\\\face_capture\\\\";
char* logFileDir = arr;
NET_DVR_SetLogToFile(3, logFileDir, FALSE);
//设置连接时间与重连时间
NET_DVR_SetConnectTime(2000, 1);
NET_DVR_SetReconnect(10000, true);
//---------------------------------------
// 注册设备
LONG lUserID;
//登录参数,包括设备地址、登录用户、密码等
NET_DVR_USER_LOGIN_INFO struLoginInfo = 0 ;
struLoginInfo.bUseAsynLogin = 0; //同步登录方式
strcpy_s(struLoginInfo.sDeviceAddress, ip); //设备IP地址
struLoginInfo.wPort = 8000; //设备服务端口
strcpy_s(struLoginInfo.sUserName, "your_username"); //设备登录用户名
strcpy_s(struLoginInfo.sPassword, "your_password"); //设备登录密码
//设备信息, 输出参数
NET_DVR_DEVICEINFO_V40 struDeviceInfoV40 = 0 ;
lUserID = NET_DVR_Login_V40(&struLoginInfo, &struDeviceInfoV40);
if (lUserID < 0)
printf("Login failed, error code: %d\\n", NET_DVR_GetLastError());
NET_DVR_Cleanup();
return 0;
//设置报警回调函数
// 注:多台设备对接时也只需要调用一次设置一个回调函数,不支持不同设备的事件在不同的回调函数里面返回
NET_DVR_SetDVRMessageCallBack_V50(0, cbMessageCallback, NULL);
//启用布防
LONG lHandle;
NET_DVR_SETUPALARM_PARAM struAlarmParam = 0 ;
struAlarmParam.dwSize = sizeof(struAlarmParam);
struAlarmParam.byFaceAlarmDetection = 0; //人脸抓拍报警,上传COMM_UPLOAD_FACESNAP_RESULT类型报警信息
//其他报警布防参数不需要设置,不支持
lHandle = NET_DVR_SetupAlarmChan_V41(lUserID, &struAlarmParam);
if (lHandle < 0)
printf("NET_DVR_SetupAlarmChan_V41 error, %d\\n", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return 0;
Sleep(120000); //等待过程中,如果设备上传报警信息,在报警回调函数里面接收和处理报警信息
//撤销布防上传通道
if (!NET_DVR_CloseAlarmChan_V30(lHandle))
printf("NET_DVR_CloseAlarmChan_V30 error, %d\\n", NET_DVR_GetLastError());
NET_DVR_Logout(lUserID);
NET_DVR_Cleanup();
return 0;
//注销用户
NET_DVR_Logout(lUserID);
//释放SDK资源
NET_DVR_Cleanup();
cout << "The program ends" << endl;
return 0;
以上是关于166VS2022调试通过海康人脸抓拍SDK的C++代码的主要内容,如果未能解决你的问题,请参考以下文章
177Java利用JNI调用C++编写的DLL,连接海康人脸抓拍机,实现人脸库全量更新。
177Java利用JNI调用C++编写的DLL,连接海康人脸抓拍机,实现人脸库全量更新。