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); } } }