1
zhanghua
2024-09-26 c775c6953d9759e70f08acbfa8f6d7490aaae3d1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
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();
    }
 
}