package com.netsdk.demo.customize.analyseTaskDemo; import com.netsdk.lib.NetSDKLib; import com.netsdk.lib.ToolKits; import com.sun.jna.Pointer; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; /** * @author : 47040 * @since : Created in 2020/7/18 10:51 */ public class DefaultAnalyseTaskResultCallBack implements NetSDKLib.fAnalyseTaskResultCallBack { private static DefaultAnalyseTaskResultCallBack singleInstance; public static DefaultAnalyseTaskResultCallBack getSingleInstance() { if (singleInstance == null) { singleInstance = new DefaultAnalyseTaskResultCallBack(); } return singleInstance; } @Override public int invoke(NetSDKLib.LLong lAttachHandle, Pointer pstAnalyseTaskResult, Pointer pBuf, int dwBufSize, Pointer dwUser) { NetSDKLib.NET_CB_ANALYSE_TASK_RESULT_INFO task = new NetSDKLib.NET_CB_ANALYSE_TASK_RESULT_INFO(); ToolKits.GetPointerData(pstAnalyseTaskResult, task); // 从指针获取智能事件分析信息 for (int i = 0; i < task.nTaskResultNum; i++) { System.out.println(task.stuTaskResultInfos[i].nTaskID); // nTaskID 和主动推送时的一一对应 for (int j = 0; j < task.stuTaskResultInfos[i].nEventCount; j++) { // 实际的事件个数 NetSDKLib.NET_SECONDARY_ANALYSE_EVENT_INFO info = task.stuTaskResultInfos[i].stuEventInfos[j]; System.out.println("type:" + info.emEventType); // 事件类型 对应 EM_ANALYSE_EVENT_TYPE switch (info.emEventType) { // 这里只介绍特征提取 case NetSDKLib.EM_ANALYSE_EVENT_TYPE.EM_ANALYSE_EVENT_FEATURE_ABSTRACT: { NetSDKLib.DEV_EVENT_FEATURE_ABSTRACT_INFO stInfo = new NetSDKLib.DEV_EVENT_FEATURE_ABSTRACT_INFO(); ToolKits.GetPointerDataToStruct(info.pstEventInfo, 0, stInfo); System.out.println("nChannelID:" + stInfo.nChannelID); // 通道号 System.out.println("nAction:" + stInfo.nAction); // 0:脉冲 1:开始 2:停止 System.out.println("emClassType:" + stInfo.emClassType); // 智能事件所属大类 参考 EM_CLASS_TYPE for (int k = 0; k < stInfo.nFeatureNum; k++) { // 错误码、特征版本号 System.out.println("FeatureVectorList[" + k + "].FeatureErrCode:" + stInfo.stuFeatureVectorList[k].emFeatureErrCode); // 错误码 System.out.println("FeatureVectorList[" + k + "].szFeatureVersion:" + new String(stInfo.stuFeatureVectorList[k].szFeatureVersion).trim()); // 特征版本版本号 // 这里的特征是设备用于比对的二进制数据,不是图片,具体内容请咨询设备研发 System.out.println("FeatureVectorList[" + k + "].stuFeatureVector.dwOffset:" + stInfo.stuFeatureVectorList[k].stuFeatureVector.dwOffset); // 人脸小图特征值在二进制数据块中的偏移 System.out.println("FeatureVectorList[" + k + "].stuFeatureVector.dwLength:" + stInfo.stuFeatureVectorList[k].stuFeatureVector.dwLength); // 人脸小图特征值长度,单位:字节 int dwOffset = stInfo.stuFeatureVectorList[k].stuFeatureVector.dwOffset; int dwLength = stInfo.stuFeatureVectorList[k].stuFeatureVector.dwLength; // 这里的特征是设备用于比对的二进制数据,不是图片,具体内容请咨询设备研发 System.out.println("FeatureVectorList[" + k + "].stuFeatureVector.dwOffset:" + dwOffset); // 人脸小图特征值在二进制数据块中的偏移 System.out.println("FeatureVectorList[" + k + "].stuFeatureVector.dwLength:" + dwLength); // 人脸小图特征值长度,单位:字节 byte[] byteArray = pBuf.getByteArray(dwOffset, dwLength); fileOut(byteArray); // 人脸抓拍角度、质量数据 System.out.println("FeatureVectorList[" + k + "].stuFaceAttribute.nAngle1:" + stInfo.stuFeatureVectorList[k].stuFaceAttribute.nAngle[0]); // 人脸抓拍角度,三个角度分别是:仰俯角,偏航角,翻滚角;默认值[999,999,999]表示无此数据 System.out.println("FeatureVectorList[" + k + "].stuFaceAttribute.nAngle2:" + stInfo.stuFeatureVectorList[k].stuFaceAttribute.nAngle[1]); // 偏航角 System.out.println("FeatureVectorList[" + k + "].stuFaceAttribute.nAngle3:" + stInfo.stuFeatureVectorList[k].stuFaceAttribute.nAngle[2]); // 翻滚角 System.out.println("FeatureVectorList[" + k + "].stuFeatureVector.nFaceAlignScore:" + stInfo.stuFeatureVectorList[k].stuFaceAttribute.nFaceAlignScore); // 人脸对齐得分分数,取值范围 0~10000,-1为无效值 System.out.println("FeatureVectorList[" + k + "].stuFeatureVector.nFaceQuality:" + stInfo.stuFeatureVectorList[k].stuFaceAttribute.nFaceQuality); // 人脸抓拍质量分数,取值范围 0~10000 } break; } default: { System.out.println("default"); break; } } } System.out.println(new String(task.stuTaskResultInfos[i].szFileID).trim()); } return 0; } public void fileOut( byte[] byteArray){ File file = new File("\\"+System.currentTimeMillis()+".txt"); FileOutputStream out=null; try { out = new FileOutputStream(file,false); String bts=""; /* for (byte bt:byteArray){ bts+=bt; }*/ int length = byteArray.length; System.out.println("length:"+length); int i1 = length % 4; int i2 = length / 4; if(i1!=0){ i2++; } for(int i=0;i