package com.iailab.netsdk.demo.module; import com.iailab.netsdk.lib.NetSDKLib; import com.iailab.netsdk.lib.ToolKits; import com.iailab.netsdk.lib.NetSDKLib.*; import com.sun.jna.Memory; import com.sun.jna.ptr.IntByReference; /** * 以图æœå›¾æŽ¥å£å®žçŽ°ï¼Œè·ŸæŸ¥è¯¢äººè„¸åº“里的人员信æ¯çš„查找接å£æ˜¯ä¸€æ ·çš„,入å‚和实现有区别 * ç›®å‰åªæ”¯æŒIVSS */ public class SearchByPictureModule { // 查询密令 public static int nToken = 0; private static LLong m_FindHandle = null; // 订阅å¥æŸ„ private static LLong attachFaceHandle = new LLong(0); /** * 按æ¡ä»¶æŸ¥è¯¢ç›®æ ‡è¯†åˆ«ç»“æžœ * @param memory å›¾ç‰‡ç¼“å˜ * @param startTime 起始时间, 历å²åº“需è¦æ—¶é—´ï¼Œäººè„¸åº“ä¸éœ€è¦æ—¶é—´ * @param endTime 结æŸæ—¶é—´, 历å²åº“需è¦æ—¶é—´ï¼Œäººè„¸åº“ä¸éœ€è¦æ—¶é—´ * @param isHistory 是å¦æ˜¯åŽ†å²åº“, true-历å²åº“ï¼› false-人脸库 * @param nChn 通é“å·ï¼Œ 历å²åº“需è¦é€šé“å·ï¼Œäººè„¸åº“ä¸éœ€è¦é€šé“å· * @param similary 相似度 * @return 查询到的所有人员个数 */ public static int startFindPerson(Memory memory, String startTime, String endTime, boolean isHistory, int nChn, String similary) { m_FindHandle = null; nToken = 0; int nTotalCount = 0; /* * å…¥å‚, IVVS设备,查询æ¡ä»¶åªæœ‰ stuInStartFind.stPerson 里的å‚数有效 */ NET_IN_STARTFIND_FACERECONGNITION stuIn = new NET_IN_STARTFIND_FACERECONGNITION(); // 人员信æ¯æŸ¥è¯¢æ¡ä»¶æ˜¯å¦æœ‰æ•ˆ, 并使用扩展结构体 stuIn.bPersonExEnable = 1; // å›¾ç‰‡ä¿¡æ¯ if(memory != null) { stuIn.pBuffer = memory; stuIn.nBufferLen = (int)memory.size(); stuIn.stPersonInfoEx.wFacePicNum = 1; stuIn.stPersonInfoEx.szFacePicInfo[0].dwOffSet = 0; stuIn.stPersonInfoEx.szFacePicInfo[0].dwFileLenth = (int)memory.size(); } // 相似度 if(!similary.isEmpty()) { stuIn.stMatchOptions.nSimilarity = Integer.parseInt(similary); } stuIn.stFilterInfo.nGroupIdNum = 0; stuIn.stFilterInfo.nRangeNum = 1; if(isHistory) { // 历å²åº“ // 通é“å· stuIn.nChannelID = nChn; stuIn.stFilterInfo.szRange[0] = EM_FACE_DB_TYPE.NET_FACE_DB_TYPE_HISTORY; // 待查询数æ®åº“类型,设备åªæ”¯æŒä¸€ä¸ª // 开始时间 String[] startTimeStr = startTime.split("-"); stuIn.stFilterInfo.stStartTime.dwYear = Integer.parseInt(startTimeStr[0]); stuIn.stFilterInfo.stStartTime.dwMonth = Integer.parseInt(startTimeStr[1]); stuIn.stFilterInfo.stStartTime.dwDay = Integer.parseInt(startTimeStr[2]); stuIn.stFilterInfo.stStartTime.dwHour= 0; stuIn.stFilterInfo.stStartTime.dwMinute= 0; stuIn.stFilterInfo.stStartTime.dwSecond= 0; // 结æŸæ—¶é—´ String[] endTimeStr = endTime.split("-"); stuIn.stFilterInfo.stEndTime.dwYear = Integer.parseInt(endTimeStr[0]); stuIn.stFilterInfo.stEndTime.dwMonth = Integer.parseInt(endTimeStr[1]); stuIn.stFilterInfo.stEndTime.dwDay = Integer.parseInt(endTimeStr[2]); stuIn.stFilterInfo.stEndTime.dwHour=23; stuIn.stFilterInfo.stEndTime.dwMinute=59; stuIn.stFilterInfo.stEndTime.dwSecond=59; stuIn.stFilterInfo.emFaceType = EM_FACERECOGNITION_FACE_TYPE.EM_FACERECOGNITION_FACE_TYPE_ALL; } else { // 人脸库 stuIn.stFilterInfo.szRange[0] = EM_FACE_DB_TYPE.NET_FACE_DB_TYPE_BLACKLIST; // 待查询数æ®åº“类型,设备åªæ”¯æŒä¸€ä¸ª } /* * å‡ºå‚ */ NET_OUT_STARTFIND_FACERECONGNITION stuOut = new NET_OUT_STARTFIND_FACERECONGNITION(); stuIn.write(); stuOut.write(); if(LoginModule.netsdk.CLIENT_StartFindFaceRecognition(LoginModule.m_hLoginHandle, stuIn, stuOut, 4000)) { m_FindHandle = stuOut.lFindHandle; nTotalCount = stuOut.nTotalCount; nToken = stuOut.nToken; } else { System.out.println("CLIENT_StartFindFaceRecognition Failed, Error:" + ToolKits.getErrorCodePrint()); } return nTotalCount; } /** * æŸ¥æ‰¾ç›®æ ‡è¯†åˆ«ç»“æžœ * @param beginNum 查询起始åºå· * @param nCount 当å‰æƒ³æŸ¥è¯¢çš„记录æ¡æ•° * @return 返回的人员信æ¯æ•°ç»„ */ public static CANDIDATE_INFOEX[] doFindNextPerson(int beginNum, int nCount) { /* *å…¥å‚ */ NetSDKLib.NET_IN_DOFIND_FACERECONGNITION stuIn = new NetSDKLib.NET_IN_DOFIND_FACERECONGNITION(); stuIn.lFindHandle = m_FindHandle; stuIn.nCount = nCount; // 当å‰æƒ³æŸ¥è¯¢çš„记录æ¡æ•° stuIn.nBeginNum = beginNum; // 查询起始åºå· /* * å‡ºå‚ */ NetSDKLib.NET_OUT_DOFIND_FACERECONGNITION stuOut = new NetSDKLib.NET_OUT_DOFIND_FACERECONGNITION();; stuOut.bUseCandidatesEx = 1; // 是å¦ä½¿ç”¨å€™é€‰å¯¹è±¡æ‰©å±•ç»“构体 // 必须申请内å˜ï¼Œæ¯æ¬¡æŸ¥è¯¢å‡ ä¸ªï¼Œå¿…é¡»è‡³å°‘ç”³è¯·å‡ ä¸ªï¼Œæœ€å¤§ç”³è¯·20个 for(int i = 0; i < nCount; i++) { stuOut.stuCandidatesEx[i].stPersonInfo.szFacePicInfo[0].nFilePathLen = 256; stuOut.stuCandidatesEx[i].stPersonInfo.szFacePicInfo[0].pszFilePath = new Memory(256); } stuIn.write(); stuOut.write(); if(LoginModule.netsdk.CLIENT_DoFindFaceRecognition(stuIn, stuOut, 4000)) { stuIn.read(); stuOut.read(); if(stuOut.nCadidateExNum == 0) { return null; } // 获å–åˆ°çš„ä¿¡æ¯ CANDIDATE_INFOEX[] stuCandidatesEx = new CANDIDATE_INFOEX[stuOut.nCadidateExNum]; for(int i = 0; i < stuOut.nCadidateExNum; i++) { stuCandidatesEx[i] = new CANDIDATE_INFOEX(); stuCandidatesEx[i] = stuOut.stuCandidatesEx[i]; } return stuCandidatesEx; } else { System.out.println("CLIENT_DoFindFaceRecognition Failed, Error:" + ToolKits.getErrorCodePrint()); } return null; } /** * 结æŸæŸ¥è¯¢ */ public static boolean doFindClosePerson() { boolean bRet = false; if(m_FindHandle.longValue() != 0) { bRet = LoginModule.netsdk.CLIENT_StopFindFaceRecognition(m_FindHandle); } return bRet; } /** * è®¢é˜…äººè„¸æŸ¥è¯¢çŠ¶æ€ * @param faceFindStateCb 人脸状æ€å›žè°ƒå‡½æ•° * @return */ public static boolean attachFaceFindState(fFaceFindState faceFindStateCb) { /* * å…¥å‚ */ NET_IN_FACE_FIND_STATE stuIn = new NET_IN_FACE_FIND_STATE(); stuIn.nTokenNum = 1; stuIn.nTokens = new IntByReference(nToken); // 查询令牌 stuIn.cbFaceFindState = faceFindStateCb; /* * å‡ºå‚ */ NET_OUT_FACE_FIND_STATE stuOut = new NET_OUT_FACE_FIND_STATE(); stuIn.write(); attachFaceHandle = LoginModule.netsdk.CLIENT_AttachFaceFindState(LoginModule.m_hLoginHandle, stuIn, stuOut, 4000); stuIn.read(); if(attachFaceHandle.longValue() != 0) { System.out.println("AttachFaceFindState Succeed!"); return true; } return false; } /** * å…³é—订阅 */ public static void detachFaceFindState() { if(attachFaceHandle.longValue() != 0) { LoginModule.netsdk.CLIENT_DetachFaceFindState(attachFaceHandle); attachFaceHandle.setValue(0); } } }