美文网首页
Android虹软人脸识别sdk使用工具类

Android虹软人脸识别sdk使用工具类

作者: 如果天空不蓝 | 来源:发表于2019-03-22 15:20 被阅读0次
    public class FaceUtil
    {
        private static final String TAG = FaceUtil.class.getSimpleName();
        private static FaceUtil faceInstance = null;
        public FaceDB mFaceDB;
        private AFR_FSDKFace mAFR_FSDKFace;
        private static Context mContext = null;
    
        //face detect
        private AFT_FSDKVersion version = new AFT_FSDKVersion();
        private AFT_FSDKEngine engine = new AFT_FSDKEngine();
        private ASAE_FSDKVersion mAgeVersion = new ASAE_FSDKVersion();
        private ASAE_FSDKEngine mAgeEngine = new ASAE_FSDKEngine();
        private ASGE_FSDKVersion mGenderVersion = new ASGE_FSDKVersion();
        private ASGE_FSDKEngine mGenderEngine = new ASGE_FSDKEngine();
        private List<AFT_FSDKFace> result = new ArrayList<>();
        private List<ASAE_FSDKAge> ages = new ArrayList<>();
        private List<ASGE_FSDKGender> genders = new ArrayList<>();
        private AFT_FSDKFace mAFT_FSDKFace = null;
        private  boolean openFace = false;
    
    
        public static FaceUtil getInstance(Context context)
        {
            if(faceInstance == null)
            {
                faceInstance = new FaceUtil(context);
            }
            return faceInstance;
        }
    
        public FaceUtil(Context context)
        {
            mContext = context;
        }
    
        public void setFaceDB()
        {
            //face
            mFaceDB = new FaceDB(mContext.getExternalCacheDir().getPath());
            Log.d(TAG,"getExternalCacheDir : "+mContext.getExternalCacheDir().getPath());
        }
    
        public void initFaceDetect()
        {
            AFT_FSDKError err = engine.AFT_FSDK_InitialFaceEngine(FaceDB.appid, FaceDB.ft_key, AFT_FSDKEngine.AFT_OPF_0_HIGHER_EXT, 16, 5);
            Log.d(TAG, "AFT_FSDK_InitialFaceEngine =" + err.getCode());
            err = engine.AFT_FSDK_GetVersion(version);
            Log.d(TAG, "AFT_FSDK_GetVersion:" + version.toString() + "," + err.getCode());
    
            ASAE_FSDKError error = mAgeEngine.ASAE_FSDK_InitAgeEngine(FaceDB.appid, FaceDB.age_key);
            Log.d(TAG, "ASAE_FSDK_InitAgeEngine =" + error.getCode());
            error = mAgeEngine.ASAE_FSDK_GetVersion(mAgeVersion);
            Log.d(TAG, "ASAE_FSDK_GetVersion:" + mAgeVersion.toString() + "," + error.getCode());
    
            ASGE_FSDKError error1 = mGenderEngine.ASGE_FSDK_InitgGenderEngine(FaceDB.appid, FaceDB.gender_key);
            Log.d(TAG, "ASGE_FSDK_InitgGenderEngine =" + error1.getCode());
            error1 = mGenderEngine.ASGE_FSDK_GetVersion(mGenderVersion);
            Log.d(TAG, "ASGE_FSDK_GetVersion:" + mGenderVersion.toString() + "," + error1.getCode());
    
        }
        
        public void deInitFaceDetect()
        {
            AFT_FSDKError err = engine.AFT_FSDK_UninitialFaceEngine();
            Log.d(TAG, "AFT_FSDK_UninitialFaceEngine =" + err.getCode());
    
            ASAE_FSDKError err1 = mAgeEngine.ASAE_FSDK_UninitAgeEngine();
            Log.d(TAG, "ASAE_FSDK_UninitAgeEngine =" + err1.getCode());
    
            ASGE_FSDKError err2 = mGenderEngine.ASGE_FSDK_UninitGenderEngine();
            Log.d(TAG, "ASGE_FSDK_UninitGenderEngine =" + err2.getCode());
        }
        
        public boolean faceFeatureDetect(byte[] mYUVData,int width,int height)
        {
            boolean bDectectFace = false;
            AFT_FSDKError err =engine.AFT_FSDK_FaceFeatureDetect(mYUVData, width, height, AFT_FSDKEngine.CP_PAF_NV21, result);
            Log.d(TAG, "AFT_FSDK_FaceFeatureDetect =" + err.getCode());
            Log.d(TAG, "Face=" + result.size());
    
            if (!result.isEmpty())
            {
                for (AFT_FSDKFace face : result) {
                    Log.d(TAG, "Face:" + face.toString());
                }
                mAFT_FSDKFace = result.get(0).clone();
    
                bDectectFace = true;
            }
            else
            {
                Log.d(TAG,"没有检测到人脸");
                bDectectFace = false;
            }
            result.clear();
            return bDectectFace;
        }
    
        public AFT_FSDKFace getmAFT_FSDKFace()
        {
            return mAFT_FSDKFace;
        }
        
        public String getAge(byte[] mYUVData,int width,int height,List<ASAE_FSDKFace> face1)
        {
            String age;
            ASAE_FSDKError error1 = mAgeEngine.ASAE_FSDK_AgeEstimation_Image(mYUVData, width, height, AFT_FSDKEngine.CP_PAF_NV21, face1, ages);
            Log.d("face", "ASAE_FSDK_AgeEstimation_Image:" + error1.getCode());
            if(ages.size()== 0)
            {
                Log.d(TAG, "ages.size()== 0" );
                age = "年龄未知";
            }
            else
            {
                Log.d(TAG, "age:" + ages.get(0).getAge());
                age = ages.get(0).getAge() == 0 ? "年龄未知" : ages.get(0).getAge() + "岁";
            }
            return age;
        }
    
        public String getGender(byte[] mYUVData,int width,int height,List<ASGE_FSDKFace> face2)
        {
            String gender;
            ASGE_FSDKError error2 = mGenderEngine.ASGE_FSDK_GenderEstimation_Image(mYUVData, width, height, AFT_FSDKEngine.CP_PAF_NV21, face2, genders);
            Log.d("face", ",ASGE_FSDK_GenderEstimation_Image:" + error2.getCode());
            if(ages.size()== 0)
            {
                Log.d(TAG, "ages.size()== 0" );
                gender = "性别未知";
            }
            else
            {
                Log.d(TAG, "gender:" +  genders.get(0).getGender());
                gender = genders.get(0).getGender() == -1 ? "性别未知" : (genders.get(0).getGender() == 0 ? "男" : "女");
            }
            return gender;
        }
    
    
    
        /**
         * @param path
         * @return
         */
        public static Bitmap decodeImage(String path) {
            Bitmap res;
            try {
                ExifInterface exif = new ExifInterface(path);
                int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
    
                BitmapFactory.Options op = new BitmapFactory.Options();
                op.inSampleSize = 1;
                op.inJustDecodeBounds = false;
                //op.inMutable = true;
                res = BitmapFactory.decodeFile(path, op);
                //rotate and scale.
                Matrix matrix = new Matrix();
    
                if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
                    matrix.postRotate(90);
                } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
                    matrix.postRotate(180);
                } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
                    matrix.postRotate(270);
                }
    
                Bitmap temp = Bitmap.createBitmap(res, 0, 0, res.getWidth(), res.getHeight(), matrix, true);
                Log.d(TAG, "check target Image:" + temp.getWidth() + "X" + temp.getHeight());
    
                if (!temp.equals(res)) {
                    res.recycle();
                }
                return temp;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
    
        public void bitmapDetect(String name,Bitmap mBitmap)
        {
            byte[] data = new byte[mBitmap.getWidth() * mBitmap.getHeight() * 3 / 2];
            ImageConverter convert = new ImageConverter();
            convert.initial(mBitmap.getWidth(), mBitmap.getHeight(), ImageConverter.CP_PAF_NV21);
            if (convert.convert(mBitmap, data)) {
                Log.d(TAG, "convert ok!");
            }
            convert.destroy();
    
            AFD_FSDKEngine engine = new AFD_FSDKEngine();
            AFD_FSDKVersion version = new AFD_FSDKVersion();
            List<AFD_FSDKFace> result = new ArrayList<AFD_FSDKFace>();
            AFD_FSDKError err = engine.AFD_FSDK_InitialFaceEngine(FaceDB.appid, FaceDB.fd_key, AFD_FSDKEngine.AFD_OPF_0_HIGHER_EXT, 16, 5);
            Log.d(TAG, "AFD_FSDK_InitialFaceEngine = " + err.getCode());
            if (err.getCode() != AFD_FSDKError.MOK) {
    //            Message reg = Message.obtain();
    //            reg.what = MSG_CODE;
    //            reg.arg1 = MSG_EVENT_FD_ERROR;
    //            reg.arg2 = err.getCode();
    //            mUIHandler.sendMessage(reg);
                Log.d(TAG, "MSG_EVENT_FD_ERROR");
                ToastUtil.showToast("sdk error :MSG_EVENT_FD_ERROR "+err.getCode());
            }
            err = engine.AFD_FSDK_GetVersion(version);
            Log.d(TAG, "AFD_FSDK_GetVersion =" + version.toString() + ", " + err.getCode());
            err  = engine.AFD_FSDK_StillImageFaceDetection(data, mBitmap.getWidth(), mBitmap.getHeight(), AFD_FSDKEngine.CP_PAF_NV21, result);
            Log.d(TAG, "AFD_FSDK_StillImageFaceDetection =" + err.getCode() + "<" + result.size());
    
            if (!result.isEmpty()) {
                AFR_FSDKVersion version1 = new AFR_FSDKVersion();
                AFR_FSDKEngine engine1 = new AFR_FSDKEngine();
                AFR_FSDKFace result1 = new AFR_FSDKFace();
                AFR_FSDKError error1 = engine1.AFR_FSDK_InitialEngine(FaceDB.appid, FaceDB.fr_key);
                Log.d(TAG, "AFR_FSDK_InitialEngine = " + error1.getCode());
                if (error1.getCode() != AFD_FSDKError.MOK) {
    //                Message reg = Message.obtain();
    //                reg.what = MSG_CODE;
    //                reg.arg1 = MSG_EVENT_FR_ERROR;
    //                reg.arg2 = error1.getCode();
    //                mUIHandler.sendMessage(reg);
                    Log.d(TAG, "MSG_EVENT_FR_ERROR");
                    ToastUtil.showToast("sdk error :MSG_EVENT_FR_ERROR "+error1.getCode());
                }
                error1 = engine1.AFR_FSDK_GetVersion(version1);
                Log.d(TAG, "FR=" + version.toString() + "," + error1.getCode()); //(210, 178 - 478, 446), degree = 1 780, 2208 - 1942, 3370
                error1 = engine1.AFR_FSDK_ExtractFRFeature(data, mBitmap.getWidth(), mBitmap.getHeight(), AFR_FSDKEngine.CP_PAF_NV21, new Rect(result.get(0).getRect()), result.get(0).getDegree(), result1);
                Log.d(TAG, "Face=" + result1.getFeatureData()[0] + "," + result1.getFeatureData()[1] + "," + result1.getFeatureData()[2] + "," + error1.getCode());
                if(error1.getCode() == error1.MOK) {
                    mAFR_FSDKFace = result1.clone();
    //                int width = result.get(0).getRect().width();
    //                int height = result.get(0).getRect().height();
    //                Bitmap face_bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    //                Canvas face_canvas = new Canvas(face_bitmap);
    //                face_canvas.drawBitmap(mBitmap, result.get(0).getRect(), new Rect(0, 0, width, height), null);
    //                Message reg = Message.obtain();
    //                reg.what = MSG_CODE;
    //                reg.arg1 = MSG_EVENT_REG;
    //                reg.obj = face_bitmap;
    //                mUIHandler.sendMessage(reg);
                    mFaceDB.addFace(name, mAFR_FSDKFace);
                    Log.d(TAG, "addFace MSG_EVENT_REG jxd");
                    ToastUtil.showToast(mContext.getString(R.string.register_face_success)+name);
                } else {
    //                Message reg = Message.obtain();
    //                reg.what = MSG_CODE;
    //                reg.arg1 = MSG_EVENT_NO_FEATURE;
    //                mUIHandler.sendMessage(reg);
                    Log.d(TAG, "MSG_EVENT_NO_FEATURE");
                    ToastUtil.showToast(mContext.getString(R.string.no_feature));
                }
                error1 = engine1.AFR_FSDK_UninitialEngine();
                Log.d(TAG, "AFR_FSDK_UninitialEngine : " + error1.getCode());
            } else {
    //            Message reg = Message.obtain();
    //            reg.what = MSG_CODE;
    //            reg.arg1 = MSG_EVENT_NO_FACE;
    //            mUIHandler.sendMessage(reg);
                Log.d(TAG, "MSG_EVENT_NO_FACE");
                ToastUtil.showToast(mContext.getString(R.string.no_face));
            }
            err = engine.AFD_FSDK_UninitialFaceEngine();
            Log.d(TAG, "AFD_FSDK_UninitialFaceEngine =" + err.getCode());
        }
    
        public static boolean isExternalStorageDocument(Uri uri) {
            return "com.android.externalstorage.documents".equals(uri.getAuthority());
        }
    
        /**
         * @param uri The Uri to check.
         * @return Whether the Uri authority is DownloadsProvider.
         */
        public static boolean isDownloadsDocument(Uri uri) {
            return "com.android.providers.downloads.documents".equals(uri.getAuthority());
        }
    
        /**
         * @param uri The Uri to check.
         * @return Whether the Uri authority is MediaProvider.
         */
        public static boolean isMediaDocument(Uri uri) {
            return "com.android.providers.media.documents".equals(uri.getAuthority());
        }
    
        /**
         * Get the value of the data column for this Uri. This is useful for
         * MediaStore Uris, and other file-based ContentProviders.
         *
         * @param context The context.
         * @param uri The Uri to query.
         * @param selection (Optional) Filter used in the query.
         * @param selectionArgs (Optional) Selection arguments used in the query.
         * @return The value of the _data column, which is typically a file path.
         */
        public static String getDataColumn(Context context, Uri uri, String selection,
                                           String[] selectionArgs) {
    
            Cursor cursor = null;
            final String column = "_data";
            final String[] projection = {
                    column
            };
    
            try {
                cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                        null);
                if (cursor != null && cursor.moveToFirst()) {
                    final int index = cursor.getColumnIndexOrThrow(column);
                    return cursor.getString(index);
                }
            } finally {
                if (cursor != null)
                    cursor.close();
            }
            return null;
        }
    
    
        public String getPath(Uri uri) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                if (DocumentsContract.isDocumentUri(mContext, uri)) {
                    // ExternalStorageProvider
                    if (isExternalStorageDocument(uri)) {
                        final String docId = DocumentsContract.getDocumentId(uri);
                        final String[] split = docId.split(":");
                        final String type = split[0];
    
                        if ("primary".equalsIgnoreCase(type)) {
                            return Environment.getExternalStorageDirectory() + "/" + split[1];
                        }
    
                        // TODO handle non-primary volumes
                    } else if (isDownloadsDocument(uri)) {
    
                        final String id = DocumentsContract.getDocumentId(uri);
                        final Uri contentUri = ContentUris.withAppendedId(
                                Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
    
                        return getDataColumn(mContext, contentUri, null, null);
                    } else if (isMediaDocument(uri)) {
                        final String docId = DocumentsContract.getDocumentId(uri);
                        final String[] split = docId.split(":");
                        final String type = split[0];
    
                        Uri contentUri = null;
                        if ("image".equals(type)) {
                            contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                        } else if ("video".equals(type)) {
                            contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                        } else if ("audio".equals(type)) {
                            contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                        }
    
                        final String selection = "_id=?";
                        final String[] selectionArgs = new String[] {
                                split[1]
                        };
    
                        return getDataColumn(mContext, contentUri, selection, selectionArgs);
                    }
                }
            }
            String[] proj = { MediaStore.Images.Media.DATA };
            Cursor actualimagecursor = mContext.getContentResolver().query(uri, proj, null, null, null);
            int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            actualimagecursor.moveToFirst();
            String img_path = actualimagecursor.getString(actual_image_column_index);
            String end = img_path.substring(img_path.length() - 4);
            if (0 != end.compareToIgnoreCase(".jpg") && 0 != end.compareToIgnoreCase(".png")) {
                return null;
            }
            return img_path;
        }
    
        public void setFaceFunction()
        {
            openFace =  SharedPreferenceUtil.getBoolean(OPEN_FACE, Constant.FACE, false);
            openFace = !openFace;
            SharedPreferenceUtil.putBoolean(OPEN_FACE, Constant.FACE, openFace);
            if(openFace)
            {
                ToastUtil.showToast(R.string.open_face);
            }
            else
            {
                ToastUtil.showToast(R.string.close_face);
            }
        }
    
        public boolean getFaceIsOpen()
        {
            return openFace;
        }
    
    
    }
    

    相关文章

      网友评论

          本文标题:Android虹软人脸识别sdk使用工具类

          本文链接:https://www.haomeiwen.com/subject/qbqrvqtx.html