package com.netsdk.demo.customize; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.NetSDKLib.CANDIDATE_INFOEX; import com.netsdk.lib.NetSDKLib.LLong; import com.netsdk.lib.ToolKits; import com.netsdk.lib.enumeration.EM_EVENT_IVS_TYPE; import com.netsdk.lib.structure.DEV_EVENT_FACERECOGNITION_INFO_V1; import com.netsdk.lib.structure.NET_IN_SET_IVSEVENT_PARSE_INFO; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.Objects; import java.util.Scanner; import static com.netsdk.lib.Utils.getOsPrefix; /** * 目标识别事件结构体简化 * @author 251823 */ public class TargetRecognitionExDemo { static NetSDKLib netsdkApi = NetSDKLib.NETSDK_INSTANCE; static NetSDKLib configApi = NetSDKLib.CONFIG_INSTANCE; private NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); // 登陆句柄 private static LLong loginHandle = new LLong(0); // 智能订阅句柄 private LLong attachHandle = new NetSDKLib.LLong(0); private static class DisconnectCallback implements NetSDKLib.fDisConnect { private static DisconnectCallback instance = new DisconnectCallback(); private DisconnectCallback() { } public static DisconnectCallback getInstance() { return instance; } public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("Device[%s:%d] Disconnect!\n", pchDVRIP, nDVRPort); } } private static class HaveReconnectCallback implements NetSDKLib.fHaveReConnect { private static HaveReconnectCallback instance = new HaveReconnectCallback(); private HaveReconnectCallback() { } public static HaveReconnectCallback getInstance() { return instance; } public void invoke(LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("Device[%s:%d] HaveReconnected!\n", pchDVRIP, nDVRPort); } } public void EndTest() { System.out.println("End Test"); if (loginHandle.longValue() != 0) { netsdkApi.CLIENT_Logout(loginHandle); } System.out.println("See You..."); netsdkApi.CLIENT_Cleanup(); System.exit(0); } public void InitTest() { // 指定智能事件解析所用的结构体 用于解决java大结构体new对象慢导致的问题.该接口全局有效,建议在SDK初始化前调用 NET_IN_SET_IVSEVENT_PARSE_INFO pInParam = new NET_IN_SET_IVSEVENT_PARSE_INFO(); pInParam.dwIVSEvent = EM_EVENT_IVS_TYPE.EVENT_IVS_FACERECOGNITION.getType(); //智能分析事件类型,参考dhnetsdk.h中定义的智能分析事件宏. pInParam.dwStructType = 1; // 指定解析的类型,具体含义参考 dwIVSEvent 字段的说明 : dwStructType为 1 时,对应结构体 DEV_EVENT_FACERECOGNITION_INFO_V1 pInParam.nCallBackType = 0;// 0 - 智能事件上报 1 - 普通报警事件上报 netsdkApi.CLIENT_SetIVSEventParseType(pInParam); // 初始化SDK库 netsdkApi.CLIENT_Init(DisconnectCallback.getInstance(), null); // 设置断线自动重练功能 netsdkApi.CLIENT_SetAutoReconnect(HaveReconnectCallback.getInstance(), null); // 向设备登入 int nSpecCap = 0; IntByReference nError = new IntByReference(0); loginHandle = netsdkApi.CLIENT_LoginEx2(address, port, username, password, nSpecCap, null, deviceInfo, nError); if (loginHandle.longValue() == 0) { System.err.printf("Login Device [%s:%d] Failed ! Last Error[%x]\n", address, port, netsdkApi.CLIENT_GetLastError()); EndTest(); return; } System.out.printf("Login Device [%s:%d] Success. \n", address, port); } // 编码格式 public static String encode; static { String osPrefix = getOsPrefix(); if (osPrefix.toLowerCase().startsWith("win32-amd64")) { encode = "GBK"; } else if (osPrefix.toLowerCase().startsWith("linux-amd64")) { encode = "UTF-8"; } } /** * 选择通道 */ private int channel = 6; public void setChannelID() { System.out.println("请输入通道,从0开始计数,-1表示全部"); Scanner sc = new Scanner(System.in); this.channel = sc.nextInt(); } /** * 订阅智能任务 */ public void AttachEventRealLoadPic() { // 先退订,设备不会对重复订阅作校验,重复订阅后会有重复的事件返回 this.DetachEventRealLoadPic(); // 需要图片 int bNeedPicture = 1; attachHandle = netsdkApi.CLIENT_RealLoadPictureEx(loginHandle, channel, NetSDKLib.EVENT_IVS_ALL, bNeedPicture, AnalyzerDataCB.getInstance(), null, null); if (attachHandle.longValue() != 0) { System.out.printf("Chn[%d] CLIENT_RealLoadPictureEx Success\n", channel); } else { System.out.printf("Ch[%d] CLIENT_RealLoadPictureEx Failed!LastError = %s\n", channel, ToolKits.getErrorCode()); } } static int count=0; /** * 报警事件(智能)回调 */ private static class AnalyzerDataCB implements NetSDKLib.fAnalyzerDataCallBack { private final File picturePath; private static AnalyzerDataCB instance; int i = 1; private AnalyzerDataCB() { picturePath = new File("./AnalyzerPicture/"); if (!picturePath.exists()) { picturePath.mkdirs(); } } public static AnalyzerDataCB getInstance() { if (instance == null) { synchronized (AnalyzerDataCB.class) { if (instance == null) { instance = new AnalyzerDataCB(); } } } return instance; } public int invoke(LLong lAnalyzerHandle, int dwAlarmType, Pointer pAlarmInfo, Pointer pBuffer, int dwBufSize, Pointer dwUser, int nSequence, Pointer reserved) { if (lAnalyzerHandle == null || lAnalyzerHandle.longValue() == 0) { return -1; } long startTime = System.currentTimeMillis(); // 获取开始时间 switch (Objects.requireNonNull(EM_EVENT_IVS_TYPE.getEventType(dwAlarmType))) { case EVENT_IVS_FACERECOGNITION: {// 目标识别(对应 DEV_EVENT_FACERECOGNITION_INFO_V1) DEV_EVENT_FACERECOGNITION_INFO_V1 msg = new DEV_EVENT_FACERECOGNITION_INFO_V1(); ToolKits.GetPointerData(pAlarmInfo, msg); System.out.println("nCandidateNum:" + msg.nCandidateNum); if(msg.nCandidateNum>0) { CANDIDATE_INFOEX[] stuCandidates = (CANDIDATE_INFOEX[]) new CANDIDATE_INFOEX().toArray(msg.nCandidateNum); for (int i = 0; i < stuCandidates.length; i++) { stuCandidates[i] = new CANDIDATE_INFOEX(); } ToolKits.GetPointerDataToStructArr(msg.stuCandidates, stuCandidates); try { System.out.println("szPersonName:" + new String(stuCandidates[0].stPersonInfo.szPersonName,"GBK")); System.out.println("szGroupID:" + new String(stuCandidates[0].stPersonInfo.szGroupID,"GBK")); System.out.println("szGroupName:" + new String(stuCandidates[0].stPersonInfo.szGroupName,"GBK")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } System.out.println("nChannelID:" + msg.nChannelID); System.out.println("目标识别事件 时间(UTC):" + msg.UTC); /////////////// 保存全景图 /////////////////// if(msg.bGlobalScenePic == 1 && msg.stuGlobalScenePicInfo != null) { String bigPicture = picturePath + "\\" + "Global" + System.currentTimeMillis()+ ".jpg"; //ToolKits.savePicture(pBuffer, msg.stuGlobalScenePicInfo.dwOffSet, msg.stuGlobalScenePicInfo.dwFileLenth, bigPicture); } /////////////// 保存人脸图 ///////////////////////// if(msg.stuObject.stPicInfo != null) { String strPersonPicPathName = picturePath + "\\" + "Person" + System.currentTimeMillis() + ".jpg"; //ToolKits.savePicture(pBuffer, msg.stuObject.stPicInfo.dwOffSet, msg.stuObject.stPicInfo.dwFileLenth, strPersonPicPathName); } break; } default: System.out.println("其他事件--------------------" + dwAlarmType); break; } long endTime = System.currentTimeMillis(); // 获取结束时间 System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); // 输出程序运行时间 return 0; } } /** * 停止侦听智能事件 */ public void DetachEventRealLoadPic() { if (attachHandle.longValue() != 0) { netsdkApi.CLIENT_StopLoadPic(attachHandle); } } /******************************** 测试控制台 ***************************************/ // 配置登陆地址,端口,用户名,密码 String address = "172.31.3.100"; int port = 37777; String username = "admin"; String password = "admin123"; public static void main(String[] args) { TargetRecognitionExDemo demo = new TargetRecognitionExDemo(); demo.InitTest(); demo.RunTest(); demo.EndTest(); } /** * 加载测试内容 */ public void RunTest() { CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this, "选择通道", "setChannelID")); menu.addItem(new CaseMenu.Item(this, "订阅智能事件", "AttachEventRealLoadPic")); menu.addItem(new CaseMenu.Item(this, "停止侦听智能事件", "DetachEventRealLoadPic")); menu.run(); } /******************************** 结束 ***************************************/ }