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); }
Dana.Lee
To:Dana_Lee1016@126.com
浙公网安备 33010602011771号