package com.netsdk.demo.customize; import com.netsdk.demo.util.CaseMenu; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.netsdk.lib.enumeration.ENUMERROR; import com.netsdk.lib.structure.NET_IN_DELIVER_USER_PICTURE; import com.netsdk.lib.structure.NET_IN_GETFACEEIGEN_INFO; import com.netsdk.lib.structure.NET_OUT_DELIVER_USER_PICTURE; import com.netsdk.lib.structure.NET_OUT_GETFACEEIGEN_INFO; import com.sun.jna.Memory; import com.sun.jna.Pointer; import com.sun.jna.ptr.IntByReference; import javax.imageio.stream.FileImageInputStream; import java.io.*; import static com.netsdk.lib.Utils.getOsPrefix; /** * * @author 251589 * @version V1.0 * @Description: * @date 2020/12/9 19:27 * */ public class UploadFaceFeatureDemo { static NetSDKLib netSDK = NetSDKLib.NETSDK_INSTANCE; private NetSDKLib.LLong loginHandle = new NetSDKLib.LLong(0); // 登陆句柄 private NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); public UploadFaceFeatureDemo(NetSDKLib.LLong loginHandle) { this.loginHandle = loginHandle; } public UploadFaceFeatureDemo() { } // 设备断线回调: 通过 CLIENT_Init 设置该回调函数,当设备出现断线时,SDK会调用该函数 public class fDisConnectCB implements NetSDKLib.fDisConnect { public void invoke(NetSDKLib.LLong lLoginID, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("Device[%s] Port[%d] Disconnect!\n", pchDVRIP, nDVRPort); } } // 网络连接恢复,设备重连成功回调 // 通过 CLIENT_SetAutoReconnect 设置该回调函数,当已断线的设备重连成功时,SDK会调用该函数 public class HaveReConnect implements NetSDKLib.fHaveReConnect { public void invoke(NetSDKLib.LLong loginHandle, String pchDVRIP, int nDVRPort, Pointer dwUser) { System.out.printf("ReConnect Device[%s] Port[%d]\n", pchDVRIP, nDVRPort); } } private UploadFaceFeatureDemo.fDisConnectCB m_DisConnectCB = new UploadFaceFeatureDemo.fDisConnectCB(); private UploadFaceFeatureDemo.HaveReConnect haveReConnect = new UploadFaceFeatureDemo.HaveReConnect(); public void EndTest() { System.out.println("End Test"); if (loginHandle.longValue() != 0) { netSDK.CLIENT_Logout(loginHandle); } System.out.println("See You..."); netSDK.CLIENT_Cleanup(); System.exit(0); } public void InitTest() { // 初始化SDK库 netSDK.CLIENT_Init(m_DisConnectCB, null); // 设置断线重连回调接口,设置过断线重连成功回调函数后,当设备出现断线情况,SDK内部会自动进行重连操作 // 此操作为可选操作,但建议用户进行设置 netSDK.CLIENT_SetAutoReconnect(haveReConnect, null); // 设置登录超时时间和尝试次数,可选 int waitTime = 3000; // 登录请求响应超时时间设置为3S int tryTimes = 3; // 登录时尝试建立链接3次 netSDK.CLIENT_SetConnectTime(waitTime, tryTimes); // 设置更多网络参数,NET_PARAM的nWaittime,nConnectTryNum成员与CLIENT_SetConnectTime // 接口设置的登录设备超时时间和尝试次数意义相同,可选 NetSDKLib.NET_PARAM netParam = new NetSDKLib.NET_PARAM(); netParam.nConnectTime = 10000; // 登录时尝试建立链接的超时时间 netSDK.CLIENT_SetNetworkParam(netParam); // 打开日志,可选 NetSDKLib.LOG_SET_PRINT_INFO setLog = new NetSDKLib.LOG_SET_PRINT_INFO(); File path = new File("."); String logPath = path.getAbsoluteFile().getParent() + "\\sdk_log\\" + System.currentTimeMillis() + ".log"; setLog.bSetFilePath = 1; System.arraycopy(logPath.getBytes(), 0, setLog.szLogFilePath, 0, logPath.getBytes().length); setLog.bSetPrintStrategy = 1; setLog.nPrintStrategy = 0; boolean logOpen = netSDK.CLIENT_LogOpen(setLog); if (!logOpen) { System.err.println("Failed to open NetSDK log !!!"); } // 设备登入 int nSpecCap = 0; Pointer pCapParam = null; IntByReference nError = new IntByReference(0); loginHandle = netSDK.CLIENT_LoginEx2(m_strIp, m_nPort, m_strUser, m_strPassword, nSpecCap, pCapParam, deviceInfo, nError); if (loginHandle.longValue() != 0) { System.out.printf("Login Device[%s] Port[%d]Success!\n", m_strIp, m_nPort); } else { System.out.printf("Login Device[%s] Port[%d]Fail.Last Error[%s]\n", m_strIp, m_nPort, ToolKits.getErrorCode() + "errorMsg: " + ENUMERROR.getErrorMessage()); EndTest(); } } public void getFaceInfo() { // 获取 String userId = "123"; // 用户ID int emType = NetSDKLib.EM_FACEINFO_OPREATE_TYPE.EM_FACEINFO_OPREATE_GET; NetSDKLib.NET_IN_GET_FACE_INFO inGet = new NetSDKLib.NET_IN_GET_FACE_INFO(); System.arraycopy(userId.getBytes(), 0, inGet.szUserID, 0, userId.getBytes().length); // 用户ID NetSDKLib.NET_OUT_GET_FACE_INFO outGet = new NetSDKLib.NET_OUT_GET_FACE_INFO(); outGet.nPhotoData = 1; // 白光人脸照片数据个数 1 outGet.nInPhotoDataLen[0] = 200 * 1024; // 用户申请的每张白光人脸照片大小 200KB int size = outGet.nInPhotoDataLen[0] * outGet.nPhotoData; outGet.pPhotoData[0] = new Memory(size); outGet.pPhotoData[0].clear(size); inGet.write(); outGet.write(); boolean bRet = netSDK.CLIENT_FaceInfoOpreate(loginHandle, emType, inGet.getPointer(), outGet.getPointer(), 5000); inGet.read(); outGet.read(); if (bRet) { System.out.println("FaceInfoOperate Get Succeed!"); System.out.println("图片个数 : " + outGet.nPhotoData); for (int i = 0; i < outGet.nPhotoData; i++) { ToolKits.savePicture(outGet.pPhotoData[i], outGet.nOutPhotoDataLen[i], "photo_data_" + i + ".jpg"); } } else { System.err.println("FaceInfoOperate Get Failed!" + netSDK.CLIENT_GetLastError() + "MSG:" + ENUMERROR.getErrorMessage()); } } /** * * 获取人脸特征值 * */ public void getFaceFeature() { // 获取人脸特征值 int emType = NetSDKLib.EM_FACEINFO_OPREATE_TYPE.EM_FACEINFO_OPREATE_GETFACEEIGEN; // 入参 NET_IN_GETFACEEIGEN_INFO inParam = new NET_IN_GETFACEEIGEN_INFO(); byte[] bytes = image("C:\\Users\\260611\\Downloads\\666.jpg"); inParam.pszPhotoData.write(0, bytes, 0, bytes.length); inParam.nPhotoDataLen = bytes.length; // 出参 NET_OUT_GETFACEEIGEN_INFO outParam = new NET_OUT_GETFACEEIGEN_INFO(); outParam.nInFaceEigenLen = 8 * 1024; inParam.write(); outParam.write(); boolean bRet = netSDK.CLIENT_FaceInfoOpreate(loginHandle, emType, inParam.getPointer(), outParam.getPointer(), 3000); inParam.read(); outParam.read(); if (bRet) { byte[] outFeature = new byte[outParam.nOutFaceEigenLen]; outParam.pszFaceEigen.read(0, outFeature, 0, outFeature.length); System.out.print("获取到的特征值为:[" + outFeature[0]); for (int i = 1; i < outParam.nOutFaceEigenLen; i++) { System.out.print("," + outFeature[i]); } System.out.println("]"); System.out.println("FaceInfoOpreate Succeed!" + outParam); } else { System.err .println("FaceInfoOpreate Failed!" + ToolKits.getErrorCode() + " " + ENUMERROR.getErrorMessage()); } } // 下发人脸数据 public void setFaceFeature() { // 入参 NET_IN_DELIVER_USER_PICTURE inParam = new NET_IN_DELIVER_USER_PICTURE(); String userId = "251500"; String citizenId = "123"; inParam.szUserID = userId.getBytes(); inParam.szCitizenID = citizenId.getBytes(); // 出参 NET_OUT_DELIVER_USER_PICTURE outParam = new NET_OUT_DELIVER_USER_PICTURE(); boolean ret = netSDK.CLIENT_DeliverUserFacePicture(loginHandle, inParam, outParam, 3000); if (ret) { System.out.println("下发人脸数据成功!"); ToolKits.GetPointerData(outParam.getPointer(), outParam); System.out.println(outParam); } else { System.err.println("下发人脸数据失败!" + netSDK.CLIENT_GetLastError() + " msg: " + ENUMERROR.getErrorMessage()); } } 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"; } } public byte[] image(String path) { byte[] data = null; FileImageInputStream input = null; try { input = new FileImageInputStream(new File(path)); ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; int numBytesRead = 0; while ((numBytesRead = input.read(buf)) != -1) { output.write(buf, 0, numBytesRead); } data = output.toByteArray(); output.close(); input.close(); } catch (FileNotFoundException ex1) { ex1.printStackTrace(); } catch (IOException ex1) { ex1.printStackTrace(); } return data; } public void RunTest() { CaseMenu menu = new CaseMenu(); menu.addItem(new CaseMenu.Item(this, "获取人脸特征值", "getFaceFeature")); menu.addItem(new CaseMenu.Item(this, "下发人脸特征值", "setFaceFeature")); menu.run(); } //////////////////////////////////////////////////////////////// String m_strIp = "172.5.54.223"; int m_nPort = 37777; String m_strUser = "admin"; String m_strPassword = "admin123"; //////////////////////////////////////////////////////////////// public static void main(String[] args) { UploadFaceFeatureDemo demo = new UploadFaceFeatureDemo(); demo.InitTest(); demo.RunTest(); demo.EndTest(); } }