【166】VS2022调试通过海康人脸抓拍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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值