package com.netsdk.demo.customize; import static com.netsdk.demo.util.StructFieldChooser.GetSelectedSingleFieldValue; import java.io.UnsupportedEncodingException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingDeque; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.NetSDKLib.LLong; import com.netsdk.lib.NetSDKLib.NET_ANALYSE_RULE; import com.netsdk.lib.NetSDKLib.NET_ANALYSE_RULE_INFO; import com.netsdk.lib.NetSDKLib.NET_CFG_LINKGROUP_INFO; import com.netsdk.lib.NetSDKLib.NET_FACEANALYSIS_RULE_INFO; import com.netsdk.lib.NetSDKLib.NET_IN_PUSH_ANALYSE_PICTURE_FILE; import com.netsdk.lib.NetSDKLib.NET_OUT_ADD_ANALYSE_TASK; import com.netsdk.lib.NetSDKLib.NET_OUT_PUSH_ANALYSE_PICTURE_FILE; import com.netsdk.lib.NetSDKLib.NET_PUSH_PICFILE_INFO; import com.netsdk.lib.ToolKits; import com.netsdk.lib.utils.Initialization; import com.sun.jna.Memory; import com.sun.jna.Pointer; public class FaceAanlysisTaskDemo extends Initialization { int taskId = 0; /** * 1-添加解析任务 */ public void addAnalyseTask() throws UnsupportedEncodingException { // 入参 NET_PUSH_PICFILE_INFO pInParam = new NET_PUSH_PICFILE_INFO(); pInParam.emStartRule = NetSDKLib.EM_ANALYSE_TASK_START_RULE.EM_ANALYSE_TASK_START_NOW; NET_ANALYSE_RULE_INFO[] net_analyse_rule_info = (NET_ANALYSE_RULE_INFO[]) new NET_ANALYSE_RULE_INFO() .toArray(32); net_analyse_rule_info[0].emClassType = NetSDKLib.EM_SCENE_CLASS_TYPE.EM_SCENE_CLASS_FACEANALYSIS; net_analyse_rule_info[0].dwRuleType = NetSDKLib.EVENT_IVS_FACEANALYSIS; net_analyse_rule_info[0].nObjectTypeNum = 1; net_analyse_rule_info[0].emObjectTypes[0] = NetSDKLib.EM_ANALYSE_OBJECT_TYPE.EM_ANALYSE_OBJECT_TYPE_HUMANFACE; NET_FACEANALYSIS_RULE_INFO pReserved = new NET_FACEANALYSIS_RULE_INFO(); NET_CFG_LINKGROUP_INFO[] linkgroup_info = (NET_CFG_LINKGROUP_INFO[]) new NET_CFG_LINKGROUP_INFO().toArray(20); linkgroup_info[0].bEnable = true; String szGroupID1 = "1"; System.arraycopy(szGroupID1.getBytes(encode), 0, linkgroup_info[0].szGroupID, 0, szGroupID1.getBytes(encode).length); Integer similarity = 75; linkgroup_info[0].bySimilarity = similarity.byteValue(); pReserved.nLinkGroupNum = 1; pReserved.stuLinkGroup = linkgroup_info; Pointer pInParam8 = new Memory(pReserved.size()); pInParam8.clear(pReserved.dwSize); ToolKits.SetStructDataToPointer(pReserved, pInParam8, 0); net_analyse_rule_info[0].pReserved = pInParam8; NET_ANALYSE_RULE net_analyse_rule = new NET_ANALYSE_RULE(); net_analyse_rule.stuRuleInfos = net_analyse_rule_info; net_analyse_rule.nRuleCount = 1;// 以一条规则为例 pInParam.stuRuleInfo = net_analyse_rule; pInParam.write(); // 出参 NET_OUT_ADD_ANALYSE_TASK pOutParam = new NET_OUT_ADD_ANALYSE_TASK(); boolean aBoolean = netSdk.CLIENT_AddAnalyseTask(loginHandle, NetSDKLib.EM_DATA_SOURCE_TYPE.EM_DATA_SOURCE_PUSH_PICFILE, pInParam.getPointer(), pOutParam, 30000); if (!aBoolean) { System.out.println("创建任务错误码:" + netSdk.CLIENT_GetLastError()); } else { taskId = pOutParam.nTaskID; System.out.println("解析任务创建成功:taskId=" + taskId); } } LLong AttachHandle = null; /** * 2-订阅分析结果 */ public void attachAnalyseTaskResult() { NetSDKLib.NET_IN_ATTACH_ANALYSE_RESULT pInParam4 = new NetSDKLib.NET_IN_ATTACH_ANALYSE_RESULT(); pInParam4.nTaskIDs[0] = taskId; pInParam4.nTaskIdNum = 1; NetSDKLib.NET_ANALYSE_RESULT_FILTER result_filter = new NetSDKLib.NET_ANALYSE_RESULT_FILTER(); result_filter.nEventNum = 1; result_filter.dwAlarmTypes[0] = NetSDKLib.EVENT_IVS_FACERECOGNITION; pInParam4.cbAnalyseTaskResult = FaceAnalyseTaskResultCallBack.getInstance(); pInParam4.stuFilter = result_filter; LLong lLong1 = netSdk.CLIENT_AttachAnalyseTaskResult(loginHandle, pInParam4, 30000); if (lLong1.longValue() == 0) { System.err.println("订阅lLong1:" + lLong1); System.err.println("订阅错误码:" + netSdk.CLIENT_GetLastError()); } else { LLong AttachHandle = lLong1; System.out.println("订阅成功taskId={}:" + taskId); } } public void DetachAnalyseTaskResult() { if (netSdk.CLIENT_DetachAnalyseTaskState(AttachHandle)) { System.out.println("DetachAnalyseTaskResult Succeed!"); } else { System.err.printf("DetachAnalyseTaskResult Failed!Last Error[0x%x]\n", netSdk.CLIENT_GetLastError()); return; } } // 创建一个容量为40的线程池 static ExecutorService executorService = Executors.newFixedThreadPool(64); /** * 3-目标识别结果回调 */ public static class FaceAnalyseTaskResultCallBack implements NetSDKLib.fAnalyseTaskResultCallBack { private FaceAnalyseTaskResultCallBack() { } private static class CallBackHolder { private static FaceAnalyseTaskResultCallBack instance = new FaceAnalyseTaskResultCallBack(); } public static FaceAnalyseTaskResultCallBack getInstance() { return FaceAnalyseTaskResultCallBack.CallBackHolder.instance; } public static NetSDKLib.NET_CB_ANALYSE_TASK_RESULT_INFO resultInfo = new NetSDKLib.NET_CB_ANALYSE_TASK_RESULT_INFO(); // public static NetSDKLib.DEV_EVENT_FACERECOGNITION_INFO // dev_event_facerecognition_info = new // NetSDKLib.DEV_EVENT_FACERECOGNITION_INFO(); @Override public int invoke(LLong lAttachHandle, Pointer pstAnalyseTaskResult, Pointer pBuf, int dwBufSize, Pointer dwUser) { // 获取数据集 byte [] a= pstAnalyseTaskResult.getByteArray(0, resultInfo.size()); executorService.submit(new Runnable() { @Override public void run() { new FaceAanlysisTaskDemo().jiexi(a); } }); return 0; } } //////////////////////////////// 静态池 //////////////////////////////// // 用阻塞队列模拟一个静态对象池 // 设置一个队列模拟静态池,容量看情况改,越大可同时处理的事件就越多,占用内存也越多 private final static int MAX_TASK_COUNT = 20; // 队列容量 private final static LinkedBlockingDeque faceReconPool = new LinkedBlockingDeque<>(MAX_TASK_COUNT); static { // 初始化队列 for (int i = 0; i < MAX_TASK_COUNT; i++) { faceReconPool.offer(new NetSDKLib.DEV_EVENT_FACERECOGNITION_INFO()); } } // public static NetSDKLib.NET_CB_ANALYSE_TASK_RESULT_INFO resultInfo = new NetSDKLib.NET_CB_ANALYSE_TASK_RESULT_INFO(); // public static NetSDKLib.DEV_EVENT_FACERECOGNITION_INFO dev_event_facerecognition_info = new NetSDKLib.DEV_EVENT_FACERECOGNITION_INFO(); public void jiexi(byte[] a) { NetSDKLib.NET_CB_ANALYSE_TASK_RESULT_INFO resultInfo = new NetSDKLib.NET_CB_ANALYSE_TASK_RESULT_INFO(); //NetSDKLib.DEV_EVENT_FACERECOGNITION_INFO dev_event_facerecognition_info = new NetSDKLib.DEV_EVENT_FACERECOGNITION_INFO(); ToolKits.ByteArrToStructure(a, resultInfo); NetSDKLib.NET_ANALYSE_TASK_RESULT[] stuTaskResultInfos = resultInfo.stuTaskResultInfos; NetSDKLib.NET_SECONDARY_ANALYSE_EVENT_INFO[] stuEventInfos = stuTaskResultInfos[0].stuEventInfos; Pointer pstEventInfo = stuEventInfos[0].pstEventInfo; NetSDKLib.DEV_EVENT_FACERECOGNITION_INFO msg = null; NetSDKLib.NET_TIME_EX UTC = null; // 抓拍时间 try { // 从静态池取 msg = faceReconPool.take(); // 抓拍时间 UTC = (NetSDKLib.NET_TIME_EX) GetSelectedSingleFieldValue("UTC", msg, pstEventInfo); System.out.println(" UTC:"+UTC.toString()); NetSDKLib.CANDIDATE_INFOEX[] stuCandidates =msg.stuCandidatesEx; NetSDKLib.FACERECOGNITION_PERSON_INFOEX stPersonInfo = stuCandidates[0].stPersonInfo; // 匹配数量 int nCandidateNum = (int)GetSelectedSingleFieldValue("nCandidateNum", msg, pstEventInfo); System.out.println(" nCandidateNum:"+nCandidateNum); //ToolKits.GetPointerData(pstEventInfo, msg); //NetSDKLib.CANDIDATE_INFO[] stuCandidates =msg.stuCandidates; //NetSDKLib.FACERECOGNITION_PERSON_INFO stPersonInfo = stuCandidates[0].stPersonInfo; // String sex = Byte.toString(stPersonInfo.bySex); //String sex1 = "1".equals(sex) ? "男" : "女"; System.out.println("处理----" + System.currentTimeMillis() + " szFileID:" + new String(stuTaskResultInfos[0].szFileID)); } catch (InterruptedException e) { System.err.println("静态池错误: " + e.getLocalizedMessage()); } catch (Exception e) { System.err.println("数据获取异常:" + e.getLocalizedMessage()); } finally { if (msg != null) { faceReconPool.offer(msg); // 重新放回静态池 } } } /** * 4-推送人脸图片 */ public void pushAnalysePictureFile() { System.out.println("startTime------------:" + System.currentTimeMillis()); NET_IN_PUSH_ANALYSE_PICTURE_FILE analysePictureFile_in = new NET_IN_PUSH_ANALYSE_PICTURE_FILE(); System.out.println(" taskId:" + taskId); analysePictureFile_in.nTaskID = taskId; analysePictureFile_in.nPicNum = 1; String str = "D:\\296.jpg"; int totalLen = 0; // 这是总的图片缓冲区长度 byte[] testFileBuffer1 = ToolKits.readPictureToByteArray(str); String fileId = "666"; System.out.println("人脸解析任务:fileId=" + fileId); byte[] fileId1 = fileId.getBytes(); System.arraycopy(fileId1, 0, analysePictureFile_in.stuPushPicInfos[0].szFileID, 0, fileId1.length); System.out.println("testFileBuffer1:" + testFileBuffer1.length); if (testFileBuffer1 != null) { analysePictureFile_in.stuPushPicInfos[0].nLength = testFileBuffer1.length; // 偏移量,有多张图时这里要特别注意 analysePictureFile_in.stuPushPicInfos[0].nOffset = totalLen; // 总的长度是各个图的累加 totalLen = totalLen + analysePictureFile_in.stuPushPicInfos[0].nLength; } analysePictureFile_in.nBinBufLen = totalLen; // 分配内存 analysePictureFile_in.pBinBuf = new Memory(totalLen); // 清理内存 analysePictureFile_in.pBinBuf.clear(totalLen); if (testFileBuffer1 != null) { // 第一张图写入缓存 analysePictureFile_in.pBinBuf.write(analysePictureFile_in.stuPushPicInfos[0].nOffset, testFileBuffer1, 0, analysePictureFile_in.stuPushPicInfos[0].nLength); } NET_OUT_PUSH_ANALYSE_PICTURE_FILE analysePictureFile_out = new NET_OUT_PUSH_ANALYSE_PICTURE_FILE(); boolean aBoolean1 = netSdk.CLIENT_PushAnalysePictureFile(loginHandle, analysePictureFile_in, analysePictureFile_out, 30000); if (!aBoolean1) { System.out.println("推送图片任务失败!"); System.out.println("推图错误码:" + netSdk.CLIENT_GetLastError()); } else { System.out.println("推图成功!!!"); } } /** * 4-推送人脸图片 */ public void pushAnalysePictureFile1(String str1, String fileId6) { System.out.println("startTime------------:" + System.currentTimeMillis()); NET_IN_PUSH_ANALYSE_PICTURE_FILE analysePictureFile_in = new NET_IN_PUSH_ANALYSE_PICTURE_FILE(); System.out.println(" taskId:" + taskId); analysePictureFile_in.nTaskID = taskId; analysePictureFile_in.nPicNum = 1; String str = str1; int totalLen = 0; // 这是总的图片缓冲区长度 byte[] testFileBuffer1 = ToolKits.readPictureToByteArray(str); String fileId = fileId6; System.out.println("人脸解析任务:fileId=" + fileId); byte[] fileId1 = fileId.getBytes(); System.arraycopy(fileId1, 0, analysePictureFile_in.stuPushPicInfos[0].szFileID, 0, fileId1.length); System.out.println("testFileBuffer1:" + testFileBuffer1.length); if (testFileBuffer1 != null) { analysePictureFile_in.stuPushPicInfos[0].nLength = testFileBuffer1.length; // 偏移量,有多张图时这里要特别注意 analysePictureFile_in.stuPushPicInfos[0].nOffset = totalLen; // 总的长度是各个图的累加 totalLen = totalLen + analysePictureFile_in.stuPushPicInfos[0].nLength; } analysePictureFile_in.nBinBufLen = totalLen; // 分配内存 analysePictureFile_in.pBinBuf = new Memory(totalLen); // 清理内存 analysePictureFile_in.pBinBuf.clear(totalLen); if (testFileBuffer1 != null) { // 第一张图写入缓存 analysePictureFile_in.pBinBuf.write(analysePictureFile_in.stuPushPicInfos[0].nOffset, testFileBuffer1, 0, analysePictureFile_in.stuPushPicInfos[0].nLength); } NET_OUT_PUSH_ANALYSE_PICTURE_FILE analysePictureFile_out = new NET_OUT_PUSH_ANALYSE_PICTURE_FILE(); boolean aBoolean1 = netSdk.CLIENT_PushAnalysePictureFile(loginHandle, analysePictureFile_in, analysePictureFile_out, 30000); if (!aBoolean1) { System.out.println("推送图片任务失败!"); System.out.println("推图错误码:" + netSdk.CLIENT_GetLastError()); } else { System.out.println("推图成功!!!"); } } public void pushs() { for (int i = 0; i < 64; i++) { String str = "D:\\296.jpg"; String fileId = (i + 1) + ""; pushAnalysePictureFile1(str, fileId); } } public void RunTest() { System.out.println("Run Test"); CaseMenu menu = new CaseMenu(); menu.addItem((new CaseMenu.Item(this, "添加智能分析任务测试", "addAnalyseTask"))); menu.addItem((new CaseMenu.Item(this, "智能分析结果", "attachAnalyseTaskResult"))); menu.addItem((new CaseMenu.Item(this, "取消智能分析订阅", "DetachAnalyseTaskResult"))); // menu.addItem((new CaseMenu.Item(this, "推送智能分析图片文件和规则信息", // "pushAnalysePictureFile"))); menu.addItem((new CaseMenu.Item(this, "批量推图", "pushs"))); menu.run(); } public static void main(String[] args) { FaceAanlysisTaskDemo analyseTaskDemo = new FaceAanlysisTaskDemo(); InitTest("172.12.5.112", 37777, "admin", "admin123"); analyseTaskDemo.RunTest(); LoginOut(); } }