package com.netsdk.demo.customize.queryFaceDetection;
|
|
import com.netsdk.demo.util.CaseMenu;
|
import com.netsdk.lib.NativeString;
|
import com.netsdk.lib.NetSDKLib;
|
import com.netsdk.lib.ToolKits;
|
import com.sun.jna.Memory;
|
import com.sun.jna.Pointer;
|
import com.sun.jna.ptr.IntByReference;
|
|
import java.io.File;
|
import java.util.Scanner;
|
|
/**
|
* @author : 47040
|
* @since : Created in 2020/9/8 16:29
|
*/
|
public class QueryFaceDetectionDemo {
|
|
// The constant net sdk
|
public static final NetSDKLib netsdk = NetSDKLib.NETSDK_INSTANCE;
|
|
// The constant config sdk.
|
public static NetSDKLib configsdk = NetSDKLib.CONFIG_INSTANCE;
|
|
////////////////////////////////////// 登录相关 ///////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
|
private NetSDKLib.NET_DEVICEINFO_Ex deviceInfo = new NetSDKLib.NET_DEVICEINFO_Ex(); // 设备信息
|
|
private NetSDKLib.LLong m_hLoginHandle = new NetSDKLib.LLong(0); // 登录句柄
|
|
/**
|
* login with high level 高安全级别登陆
|
*/
|
public void loginWithHighLevel() {
|
|
NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY pstlnParam =
|
new NetSDKLib.NET_IN_LOGIN_WITH_HIGHLEVEL_SECURITY() {{
|
szIP = m_strIpAddr.getBytes();
|
nPort = m_nPort;
|
szUserName = m_strUser.getBytes();
|
szPassword = m_strPassword.getBytes();
|
}}; // 输入结构体参数
|
NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY pstOutParam =
|
new NetSDKLib.NET_OUT_LOGIN_WITH_HIGHLEVEL_SECURITY(); // 输结构体参数
|
|
// 写入sdk
|
m_hLoginHandle = netsdk.CLIENT_LoginWithHighLevelSecurity(pstlnParam, pstOutParam);
|
|
if (m_hLoginHandle.longValue() == 0) {
|
System.err.printf("Login Device[%s] Port[%d]Failed. %s\n", m_strIpAddr, m_nPort,
|
netsdk.CLIENT_GetLastError());
|
} else {
|
deviceInfo = pstOutParam.stuDeviceInfo; // 获取设备信息
|
System.out.println("Login Success");
|
System.out.println("Device Address:" + m_strIpAddr);
|
System.out.println("设备包含:" + deviceInfo.byChanNum + "个通道");
|
}
|
}
|
|
/**
|
* logout 退出
|
*/
|
public void logOut() {
|
if (m_hLoginHandle.longValue() != 0) {
|
netsdk.CLIENT_Logout(m_hLoginHandle);
|
System.out.println("LogOut Success");
|
}
|
}
|
|
////////////////////////////////////// 目标检测历史库查询 //////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
|
public void FindFaceDetectionTest() {
|
/**
|
* 这里给出查询的示例,条件为:
|
* 时间: 2020/09/02 0:0:0 - 2020/09/02 23:59:59
|
* 通道: 3 (sdk 3, 设备 4)
|
* 性别: 男
|
* 年龄: 20-39
|
* 眼镜: 无
|
* 口罩: 无
|
* 表情: 惊讶
|
* 胡子: 无
|
* 获取全景图
|
*/
|
|
int type = NetSDKLib.EM_FILE_QUERY_TYPE.NET_FILE_QUERY_FACE_DETECTION;
|
|
NetSDKLib.MEDIAFILE_FACE_DETECTION_PARAM queryCondition = new NetSDKLib.MEDIAFILE_FACE_DETECTION_PARAM();
|
|
// 图片类型,0:未知类型,1:人脸全景大图,2:人脸小图
|
queryCondition.emPicType = 1; // 有时候设备只存了一种图,填1和2没有区别
|
|
// 通道号从0开始,-1表示查询所有通道
|
queryCondition.nChannelID = 5;
|
|
// 开始时间
|
queryCondition.stuStartTime.dwYear = 2020;
|
queryCondition.stuStartTime.dwMonth = 9;
|
queryCondition.stuStartTime.dwDay = 3;
|
queryCondition.stuStartTime.dwHour = 0;
|
queryCondition.stuStartTime.dwMinute = 0;
|
queryCondition.stuStartTime.dwSecond = 0;
|
|
// 结束时间
|
queryCondition.stuEndTime.dwYear = 2020;
|
queryCondition.stuEndTime.dwMonth = 9;
|
queryCondition.stuEndTime.dwDay = 3;
|
queryCondition.stuEndTime.dwHour = 23;
|
queryCondition.stuEndTime.dwMinute = 59;
|
queryCondition.stuEndTime.dwSecond = 59;
|
|
////////////////////// 如果不需要额外的搜索条件,下面的参数都可以不填 ///////////////////////////////
|
|
queryCondition.emSex = NetSDKLib.EM_DEV_EVENT_FACEDETECT_SEX_TYPE.EM_DEV_EVENT_FACEDETECT_SEX_TYPE_MAN; // 男
|
queryCondition.bAgeEnable = 1; // 启用年龄搜索,不需要这个条件请置为 1
|
if (queryCondition.bAgeEnable == 1) {
|
queryCondition.nAgeRange[0] = 20; // 下区间
|
queryCondition.nAgeRange[1] = 39; // 上区间
|
}
|
queryCondition.emGlasses = NetSDKLib.EM_FACEDETECT_GLASSES_TYPE.EM_FACEDETECT_WITHOUT_GLASSES; // 无眼镜
|
queryCondition.emMask = NetSDKLib.EM_MASK_STATE_TYPE.EM_MASK_STATE_NOMASK; // 无口罩
|
|
queryCondition.nEmotionValidNum = 1;
|
queryCondition.emEmotion[0] = NetSDKLib.EM_DEV_EVENT_FACEDETECT_FEATURE_TYPE.EM_DEV_EVENT_FACEDETECT_FEATURE_TYPE_SURPRISE; // 惊讶
|
|
queryCondition.emBeard = NetSDKLib.EM_BEARD_STATE_TYPE.EM_BEARD_STATE_NOBEARD; // 没有胡子
|
|
//////////////////////////////////////// FindFile ///////////////////////////////////////////////
|
/////////////////////////////////////// 设备准备搜索结果 //////////////////////////////////////////
|
|
queryCondition.write();
|
NetSDKLib.LLong lFindHandle = netsdk.CLIENT_FindFileEx(m_hLoginHandle, type, queryCondition.getPointer(), null, 3000);
|
if (lFindHandle.longValue() == 0) {
|
System.err.println("FindFileEx Failed!" + netsdk.CLIENT_GetLastError());
|
return;
|
} else {
|
System.out.println("FindFileEx success.");
|
}
|
queryCondition.read();
|
|
/////////////////////////////////////// GetTotalFileCount //////////////////////////////////
|
/////////////////////////////////////// 查看共有多少数据 //////////////////////////////////
|
|
IntByReference pCount = new IntByReference();
|
|
boolean rt = netsdk.CLIENT_GetTotalFileCount(lFindHandle, pCount, null, 2000);
|
if (!rt) {
|
System.err.println("获取搜索句柄:" + lFindHandle + " 的搜索内容量失败。");
|
return;
|
}
|
System.out.println("搜索句柄:" + lFindHandle + " 共获取到:" + pCount.getValue() + " 条数据。");
|
|
/////////////////////////////////////// FindNextFile ////////////////////////////////////////////
|
///////////////////////////////////// 循环获取查询数据 ////////////////////////////////////////////
|
|
int nMaxCount = 10; // 一次最多获取条数,不一定会有这么多,数值不宜太大
|
|
NetSDKLib.MEDIAFILE_FACE_DETECTION_INFO[] stuMediaFaceDetection = new NetSDKLib.MEDIAFILE_FACE_DETECTION_INFO[nMaxCount];
|
for (int i = 0; i < stuMediaFaceDetection.length; ++i) {
|
stuMediaFaceDetection[i] = new NetSDKLib.MEDIAFILE_FACE_DETECTION_INFO();
|
}
|
|
int MemorySize = stuMediaFaceDetection[0].size() * nMaxCount;
|
Pointer pMediaFileInfo = new Memory(MemorySize);
|
pMediaFileInfo.clear(MemorySize);
|
|
ToolKits.SetStructArrToPointerData(stuMediaFaceDetection, pMediaFileInfo);
|
|
//循环查询
|
int nCurCount = 0;
|
int nFindCount = 0;
|
while (true) {
|
int nRet = netsdk.CLIENT_FindNextFileEx(lFindHandle, nMaxCount, pMediaFileInfo, MemorySize, null, 3000);
|
|
// 从指针中把数据复制出来
|
ToolKits.GetPointerDataToStructArr(pMediaFileInfo, stuMediaFaceDetection);
|
System.out.println("获取到记录数 : " + nRet);
|
|
if (nRet < 0) {
|
System.err.println("FindNextFileEx failed!" + netsdk.CLIENT_GetLastError());
|
break;
|
} else if (nRet == 0) {
|
break;
|
}
|
|
// 展示数据
|
for (int i = 0; i < nRet; i++) {
|
nFindCount = i + nCurCount * nMaxCount;
|
System.out.println("—————————————————————————————————————————————————");
|
System.out.println("[" + nFindCount + "]通道号 :" + stuMediaFaceDetection[i].ch);
|
System.out.println("[" + nFindCount + "]开始时间 :" + stuMediaFaceDetection[i].starttime.toStringTime());
|
System.out.println("[" + nFindCount + "]结束时间 :" + stuMediaFaceDetection[i].endtime.toStringTime());
|
System.out.println("[" + nFindCount + "]年龄 :" + stuMediaFaceDetection[i].nAge);
|
System.out.println("[" + nFindCount + "]性别 :" + stuMediaFaceDetection[i].emSex); // 参考 EM_DEV_EVENT_FACEDETECT_SEX_TYP
|
System.out.println("[" + nFindCount + "]口罩 :" + stuMediaFaceDetection[i].emMask); // 参考 EM_MASK_STATE_TYPE
|
System.out.println("[" + nFindCount + "]胡子 :" + stuMediaFaceDetection[i].emBeard); // 参考 EM_BEARD_STATE_TYPE
|
System.out.println("[" + nFindCount + "]眼镜 :" + stuMediaFaceDetection[i].emGlasses); // 参考 EM_FACEDETECT_GLASSES_TYPE
|
System.out.println("[" + nFindCount + "]表情 :" + stuMediaFaceDetection[i].emEmotion); // 参考 EM_DEV_EVENT_FACEDETECT_FEATURE_TYPE
|
if (stuMediaFaceDetection[i].nFileType == 1) {
|
System.out.println("[" + nFindCount + "]文件类型 : jpg图片");
|
}
|
System.out.println("[" + nFindCount + "]文件路径 :" + new String(stuMediaFaceDetection[i].szFilePath).trim());
|
}
|
|
if (nRet < nMaxCount) {
|
break;
|
} else {
|
nCurCount++;
|
}
|
}
|
|
netsdk.CLIENT_FindCloseEx(lFindHandle);
|
|
}
|
|
// 下载图片
|
public void TestDownloadRemoteFile() {
|
|
// 图片在 FaceDetectHistoryPic 文件夹下
|
|
Scanner sc = new Scanner(System.in);
|
System.out.println("请输入图片设备端地址:");
|
|
String filePath = sc.next().trim();
|
|
System.out.println("请输入本地图片名称: ");
|
|
String saveName = sc.next().trim();
|
|
DownloadRemoteFile(filePath, saveName);
|
|
}
|
|
/**
|
* 下载图片用,如果报 21 错误,说明找不到图片,可以去网页上确认下是不是也获取不到
|
*/
|
public void DownloadRemoteFile(String filePath, String saveName) {
|
|
NetSDKLib.NET_IN_DOWNLOAD_REMOTE_FILE pInParam = new NetSDKLib.NET_IN_DOWNLOAD_REMOTE_FILE();
|
pInParam.pszFileName = new NativeString(filePath).getPointer();
|
|
File path = new File("./FaceDetectHistoryPic/");
|
if (!path.exists()) path.mkdir();
|
|
pInParam.pszFileDst = new NativeString(path + "/" + saveName).getPointer();
|
NetSDKLib.NET_OUT_DOWNLOAD_REMOTE_FILE pOutParam = new NetSDKLib.NET_OUT_DOWNLOAD_REMOTE_FILE();
|
if (!netsdk.CLIENT_DownloadRemoteFile(m_hLoginHandle, pInParam, pOutParam, 3000)) {
|
System.err.printf("CLIENT_DownloadRemoteFile failed, ErrCode=%s\n", ToolKits.getErrorCode());
|
} else {
|
System.out.println("CLIENT_DownloadRemoteFile success");
|
}
|
}
|
|
/////////////////////////////////////// 简易控制台 ///////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////
|
|
// 初始化测试
|
public void InitTest() {
|
|
QueryFaceDetectionUtils.Init(); // 初始化SDK库
|
this.loginWithHighLevel(); // 高安全登录
|
}
|
|
// 加载测试内容
|
public void RunTest() {
|
CaseMenu menu = new CaseMenu();
|
/**
|
* 这里给出查询的示例,条件为:
|
* 时间: 2020/09/02 0:0:0 - 2020/09/02 23:59:59
|
* 通道: 3 (sdk 3, 设备 4)
|
* 性别: 男
|
* 年龄: 20-39
|
* 眼镜: 无
|
* 口罩: 无
|
* 表情: 惊讶
|
* 胡子: 无
|
* 获取全景图
|
*/
|
menu.addItem(new CaseMenu.Item(this, "测试获取目标检测历史数据", "FindFaceDetectionTest"));
|
// 图片在 FaceDetectHistoryPic 文件夹下
|
menu.addItem(new CaseMenu.Item(this, "下载图片", "TestDownloadRemoteFile"));
|
menu.run();
|
}
|
|
// 结束测试
|
public void EndTest() {
|
System.out.println("End Test");
|
this.logOut(); // 退出
|
System.out.println("See You...");
|
|
QueryFaceDetectionUtils.cleanAndExit(); // 清理资源并退出
|
}
|
|
/////////////// 配置登陆地址,端口,用户名,密码 ////////////////////////
|
private String m_strIpAddr = "10.172.161.19";
|
private int m_nPort = 37777;
|
private String m_strUser = "admin";
|
private String m_strPassword = "admin123";
|
//////////////////////////////////////////////////////////////////////
|
|
public static void main(String[] args) {
|
System.out.println(
|
"这里给出查询的示例,条件为:\n" +
|
"时间: 2020/09/02 0:0:0 - 2020/09/02 23:59:59\n" +
|
"通道: 3 (sdk 3, 设备 4)\n" +
|
"性别: 男\n" +
|
"年龄: 20-39\n" +
|
"眼镜: 无\n" +
|
"口罩: 无\n" +
|
"表情: 惊讶\n" +
|
"胡子: 无\n" +
|
"获取全景图\n" +
|
"图片在 FaceDetectHistoryPic 文件夹下");
|
|
QueryFaceDetectionDemo demo = new QueryFaceDetectionDemo();
|
|
if (args.length == 4) {
|
demo.m_strIpAddr = args[0];
|
demo.m_nPort = Integer.parseInt(args[1]);
|
demo.m_strUser = args[2];
|
demo.m_strPassword = args[3];
|
}
|
|
demo.InitTest();
|
demo.RunTest();
|
demo.EndTest();
|
}
|
|
}
|