a
554325746@qq.com
2019-12-25 7340eb0b160eacbbd0f3c2289e3ac6150da235f3
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
package com.basic.security.utils;
 
import android.app.Activity;
import android.content.ContextWrapper;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;
 
import com.basic.security.base.BaseApplication;
import com.basic.security.manager.BaseManager;
import com.basic.security.manager.DeviceManager;
import com.basic.security.manager.DirManager;
import com.basic.security.manager.IdCardManager;
import com.basic.security.manager.SystemInitManager;
import com.basic.security.model.ModelAdapter;
import com.basic.security.utils.socket.outdoor.OutdoorGuestSocketServer;
import com.basic.security.utils.socket.server.TableRowReceiveSocketServer;
import com.basic.security.widget.Preview;
 
 
public class FaceId {
    public static FaceId instance = new FaceId();
    public static Activity activity = null;
 
    static {
//        System.loadLibrary("firefly_api");
        System.loadLibrary("opencv_java3");
//        System.loadLibrary("libjpeg");
        System.loadLibrary("THFaceImage");
//        System.loadLibrary("THFacialPos");
        System.loadLibrary("native-lib");
        System.loadLibrary("THFeature");
    }
 
    public boolean sdkInitSuccess = false;
 
    public static void initSdk(Activity activity, Preview rgbPreview, Preview grayPreview, DetectListener detectListener) {
        String ip = NetUtil.getIPAddress(true);
        Constants.deviceId = DeviceManager.getDeviceId();
        FaceId.activity = activity;
        AssetHelper.copyAssets(activity.getAssets(), new ContextWrapper(activity).getFilesDir().getAbsolutePath());
        DirManager.mkdirs();
        SystemInitManager.initTablesAndDefaultValues();
 
        if (Constants.isOutdoor) {
            OutdoorGuestSocketServer.startServer();
        }
        TableRowReceiveSocketServer.startServer();
 
        if (!Constants.stopCameraAndVideo) {
            if (rgbPreview != null) {
                rgbPreview.init(activity, Constants.RGB_CAMERA, detectListener);
            }
            if (grayPreview != null && Constants.USE_GRAY_CAMERA) {
                grayPreview.init(activity, Constants.GRAY_CAMERA, detectListener);
            }
        }
        try {
//            FaceId.instance.initSdk(new ContextWrapper(BaseApplication.getApplication().activity).getFilesDir().getAbsolutePath());
        } catch (Exception e) {
            e.printStackTrace();
        }
        ProcessImageAndDrawResults.addDetectedListener(detectListener);
    }
 
    public static void testSdk(String jpgFile1, String jpgFile2) {
        BaseApplication.getApplication().detectLock.lock();
        Bitmap bitmap1 = BitmapFactory.decodeFile(jpgFile1);
        if (bitmap1 == null) {
            BaseApplication.getApplication().detectLock.unlock();
            return;
        }
        byte[] byte1 = IdCardManager.getPixelsBGR(bitmap1);
        byte[] featureData1 = FaceId.instance.extractFeature1(byte1, bitmap1.getWidth(), bitmap1.getHeight());
        if (featureData1 == null) {
            BaseApplication.getApplication().detectLock.unlock();
            return;
        }
        String base64 = Base64.encodeToString(featureData1, Base64.NO_WRAP);
        ModelAdapter person1 = new ModelAdapter("p1");
        person1.setString("table", "person");
        person1.setString("camera_image_feature", base64);
        BaseManager.save(person1);
        ModelAdapter dbPerson1 = BaseManager.findById("person", "p1");
        featureData1 = Base64.decode(dbPerson1.getString("camera_image_feature"), Base64.NO_WRAP);
        Bitmap bitmap2 = BitmapFactory.decodeFile(jpgFile2);
        if (bitmap2 == null) {
            BaseApplication.getApplication().detectLock.unlock();
            return;
        }
        byte[] byte2 = IdCardManager.getPixelsBGR(bitmap2);
        byte[] featureData2 = FaceId.instance.extractFeature1(byte2, bitmap2.getWidth(), bitmap2.getHeight());
        if (featureData2 == null) {
            BaseApplication.getApplication().detectLock.unlock();
            return;
        }
        String base642 = Base64.encodeToString(featureData2, Base64.NO_WRAP);
        ModelAdapter person2 = new ModelAdapter("p2");
        person2.setString("table", "person");
        person2.setString("camera_image_feature", base642);
        BaseManager.save(person2);
        ModelAdapter dbPerson2 = BaseManager.findById("person", "p2");
        featureData2 = Base64.decode(dbPerson2.getString("camera_image_feature"), Base64.NO_WRAP);
        float score = FaceId.instance.compareFeature(featureData1, featureData2);
        System.out.println("testSdk=" + score);
        BaseApplication.getApplication().detectLock.unlock();
    }
 
    public native boolean initSdk(String modelPath);
 
    public native void detectFace(DetectedResult detectedResult);
 
    public native String rgbDetectFace(String modelPath, String rgbFileName, int width, int height, String baseFeatureName, int shouldExtractFeature, boolean useGrayCamera, int detectFaceCount);
 
    public native String rgbDetectFace2(String modelPath, String rgbFileName, int width, int height, String baseFeatureName, int shouldExtractFeature, boolean useGrayCamera, int detectFaceCount, byte[] bgrArray);
 
    public native String rgbDetectFace4(int channel, String modelPath, String rgbFileName, int width, int height, String baseFeatureName, int shouldExtractFeature, boolean useGrayCamera, int detectFaceCount, byte[] bgrArray);
 
    public native String rgbDetectFace3(int channel, String modelPath, int width, int height, String baseFeatureName,
                                        int shouldExtractFeature, boolean useGrayCamera, int detectFaceCount, byte[] nv21Array);
 
    public native String grayDetectFace(String modelPath, String rgbFileName, int width, int height, int detectFaceCount);
 
    public native void cropFace(String frameJpgPath, String faceJpgPath, int width, int height, int x1, int y1, int x2, int y2);
 
    // 返回/baseFeatureName/feature1,/baseFeatureName/feature2. 逗号分隔, 用于身份证
    public native byte[] extractFeature(String jpgFileName);
 
    public native String facePosition(String jpgFileName);
 
    public native byte[] extractFeature1(byte[] bgrData, int width, int height);
 
    public native String compareFeature(String featureFileName1, String featureFileName2);
 
    public native float compareFeature(byte[] featureBuffer1, byte[] featureBuffer2);
 
    // 返回
    public native String compareFeatureInDb(String featureFileName);
 
    // 2
    public native String compareFeatureInDb(byte[] featureBuffer, int minScore);
 
    // 1 3
    public native void addFeatureToDb(String id, byte[] featureBuffer);
 
    public native void removeFeatureFromDb(String id);
 
    public native void addFeatureToTempDb(String id, byte[] featureBuffer);
 
    public native String compareFeatureInTempDb(byte[] featureBuffer, int minScore);
 
    public native void removeFeatureFromTempDb(String id);
 
    public native String receiveBroadcast(char broadcastPort);
 
    public native byte[] yuv420p2rgb24(byte[] yuvbuffer, byte[] rgbbuffer, int width, int height);
}