kz两张人脸图片比对返回比对值

  • 本sdk需要联网(仅在初始化阶段,因为需要从服务器获取一个key文件)
  • 集成代码
    package demo1.tech.anyun.com.myapplication.mgr;
    
    import android.content.Context;
    import android.os.Environment;
    import android.util.Log;
    
    import com.kz.face.Gnitionface;
    import com.kz.face.stGnFImage;
    import com.kz.face.stGnFaceInfoEx;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    import demo1.tech.anyun.com.myapplication.util.FileUtil;
    
    /**
     * 
     * Created by lzw on 2018/5/21. 09:46:13
     * 邮箱:632393724@qq.com
     * All Rights Saved! Chongqing AnYun Tech co. LTD
     */
    public class KzSdk {
        private static final KzSdk ourInstance = new KzSdk();
        private static final String TAG = "KzSdk";
        private IKzSDK mIkzSdk;
        private long m_handle;//句柄
        private boolean isInit = false;
    
        public static KzSdk getInstance() {
            return ourInstance;
        }
    
        private KzSdk() {
        }
    
        public void init(final Context context,IKzSDK iKzSDK){
            this.mIkzSdk = iKzSDK;
            //初始化科技人脸识别SDK 需要将 GnitionfaceBin.bin文件拷贝到设备中,所以开启子线程
            final String dir = Environment.getExternalStorageDirectory()+"/";
    
            final String fileName = "GnitionfaceBin.bin";
            if (!FileUtil.containFile(dir+fileName)){
                Log.i(TAG,"开始拷贝"+fileName);
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
    
                            InputStream inputStream = context.getResources().getAssets().open(fileName);
    
                            Log.i(TAG,"dir:"+dir);
                            writeToDisk(inputStream, dir, fileName, new IWriteFile() {
                                @Override
                                public void onSucceed() {
                                    Log.i(TAG,"初始化科技人脸SDK");
                                    int ret = Gnitionface.init((dir+fileName).getBytes(),context.getApplicationContext());
                                    Log.i(TAG,"初始化科技人脸SDK"+(ret==0?"成功":"失败")+":"+ret);
    
                                    if (mIkzSdk != null){
                                        mIkzSdk.onResult(ret);
                                    }
                                    isInit = ret==0? true:false;
    
                                }
    
                                @Override
                                public void onFailed(String des) {
                                    if (mIkzSdk != null){
                                        isInit = false;
                                        mIkzSdk.onResult(-100);
                                    }
                                }
                            });
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
    
                    }
                }).start();
    
            }else{
                Log.i(TAG,fileName+"已存在指定的目录,无需再拷贝");
                int ret = Gnitionface.init((dir+fileName).getBytes(),context.getApplicationContext());
                Log.i(TAG,"初始化科技人脸SDK"+(ret==0?"成功":"失败")+":"+ret);
                if (mIkzSdk != null){
                    mIkzSdk.onResult(ret);
                }
                isInit = ret==0? true:false;
            }
    
    
        }
    
    
        public void uninit(){
            Gnitionface.unInit();
        }
    
    
    
    
        private stGnFImage stGnFaceInfo = new stGnFImage();
        private stGnFaceInfoEx[] stGnFaceInfoExes;
    
        /**
         * 有耗时操作请在子线程中调用
         * @param context
         * @param BaseimgData
         * @param imgData
         * @return
         */
        public float matchFaces(Context context,byte[] BaseimgData,byte[] imgData){
            if (isInit){
                Log.i(TAG,"开始调用matchFaces");
    
                byte[] feature1 = new byte[0];
                byte[] feature2 = new byte[0];
    
    
    
                m_handle = Gnitionface.createhandle(context.getApplicationContext());
    
                if (BaseimgData != null && BaseimgData.length>0){
    
    
                    Gnitionface.decodeImage(BaseimgData,BaseimgData.length,stGnFaceInfo);
    
                    stGnFaceInfoExes=Gnitionface.detectFaces(m_handle,stGnFaceInfo,1);
    
                    feature1 =Gnitionface.getfaceFeature(m_handle,stGnFaceInfoExes[0]);
    
                }else{
                    Log.i(TAG,"基准图片不能为空");
                    return 0;
                }
                if (imgData!=null && imgData.length>0){
    
                    Gnitionface.decodeImage(imgData,imgData.length,stGnFaceInfo);
                    stGnFaceInfoExes=Gnitionface.detectFaces(m_handle,stGnFaceInfo,1);
                    feature2 =Gnitionface.getfaceFeature(m_handle,stGnFaceInfoExes[0]);
                }else{
                    Log.i(TAG,"要比对的图片不能为空");
                    return 0;
                }
                float score = Gnitionface.matchFeature(feature1,feature1.length,feature2,feature2.length);
    
    
                releaseRes();
                Log.i(TAG,"score:"+score);
                return score;
            }else{
                Log.i(TAG,"未初始化人脸sdk或初始化不成功");
                return 0;
            }
    
        }
    
        /**
         * 释放句柄以及其他资源
         */
        private void releaseRes(){
            Gnitionface.releaseFaces(m_handle,stGnFaceInfoExes);
            Gnitionface.releaseImage(stGnFaceInfo);
    
            Gnitionface.destroyhandle(m_handle);
        }
    
        /**
         * 写文件到SD卡
         * @param is 输入流
         * @param dir 文件所在目录
         * @param name 文件名
         * @param iWriteFile 写成功与否回调
         * @return
         */
        private File writeToDisk(InputStream is, String dir, String name,IWriteFile iWriteFile) {
            final File file = new File(dir, name);
            BufferedInputStream bis = null;
            FileOutputStream fos = null;
            BufferedOutputStream bos = null;
    
            try {
                bis = new BufferedInputStream(is);
                fos = new FileOutputStream(file);
                bos = new BufferedOutputStream(fos);
    
                byte data[] = new byte[1024 * 4];
    
                int count;
                while ((count = bis.read(data)) != -1) {
                    bos.write(data, 0, count);
                }
    
                bos.flush();
                fos.flush();
                if (iWriteFile != null){
                    iWriteFile.onSucceed();
                }
    
            } catch (IOException e) {
                e.printStackTrace();
                if (iWriteFile != null){
                    iWriteFile.onFailed(e.getMessage());
                }
    
            } finally {
                try {
                    if (bos != null) {
                        bos.close();
                    }
                    if (fos != null) {
                        fos.close();
                    }
                    if (bis != null) {
                        bis.close();
                    }
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
            return file;
        }
    }
    

     

  • 调用示例
    •   初始化
    • 代码如下:
              KzSdk.getInstance().init(getApplicationContext(), new IKzSDK() {
                  @Override
                  public void onResult(int ret) {
      
                              Log.i(TAG,"人脸SDK初始化"+ (ret==0?"成功":"失败"));
                  }
              });
      

        

    • 两张图片进行比对,返回一个float值(调用示例)
    • 代码如下:
        Bitmap bitmap1 = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/pic1.jpg");
                      Bitmap bitmap2 = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/pic2.jpg");
                      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
                      ByteArrayOutputStream byteArrayOutputStream1 = new ByteArrayOutputStream();
                      bitmap1.compress(Bitmap.CompressFormat.JPEG,100,byteArrayOutputStream);
                      final byte[] data1 = byteArrayOutputStream.toByteArray();
      
                      bitmap2.compress(Bitmap.CompressFormat.JPEG,100,byteArrayOutputStream1);
                      final byte[] data2 = byteArrayOutputStream1.toByteArray();
      
                      new AsyncTask<Void, Void, Float>() {
                          @Override
                          protected Float doInBackground(Void... voids) {
                              return  KzSdk.getInstance().matchFaces(MainActivity.this, data1,data2);
                          }
      
                          @Override
                          protected void onPostExecute(Float aFloat) {
                              super.onPostExecute(aFloat);
                              Log.i(TAG,"人脸比对的结果---------"+aFloat);
      
                          }
                      }.execute();
      

        

    • 其他代码:
    • public interface IWriteFile {
          void onSucceed();
          void onFailed(String des);
      }
      

        

      public interface IKzSDK {
          void onResult(int ret);
      }
      

        

posted on 2018-05-22 14:05  endian11  阅读(322)  评论(0)    收藏  举报

导航