# FaceTracking **Repository Path**: litz/FaceTracking ## Basic Information - **Project Name**: FaceTracking - **Description**: 人脸识别SDK - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2022-01-13 - **Last Updated**: 2022-01-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # FaceTracking #### 介绍 智能停车服务屏 人脸识别SDK ! #### 安装教程 1. 下载本SDK包至本地 2. libs为SDK包 3. FaceTrackingDemo为演示样例 #### 使用说明 1.导入SDK ![导入SDK](https://images.gitee.com/uploads/images/2020/1014/152438_64f19229_2077234.png "导入SDK.png") 2.调用SDK 在MainActivity或者Application的onCreate中初始模型 @Override protected void onResume() { super.onResume(); /* * 初始FaceTracking模型 * FaceTrackingUtils.setDefaultData方法只会执行一次。 */ FaceTrackingUtils.setInitModelFiles(getApplicationContext()); } 4.===================================兼容9.0系统=SDK1.5及以上使用方式↓=========================================== 01.授权 private String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; 02.打开自定义Activity人脸识别界面,继承BaseFaceActivity 在onCreate()中 SurfaceView创建成功后打开相机: mSurfaceView = findViewById(R.id.surface_view); .... @Override public void surfaceCreated(final SurfaceHolder holder) { // 打开相机 initCamera(); } 03.配置相机参数: parameters.setPreviewSize(1280, 720); // 设置最终的预览尺寸 parameters.setPictureSize(1920, 1080); // 设置最终的图片尺寸 mCamera.setDisplayOrientation(0); // 设置预览角度:8.1预览视图方向 旋转180, 9.0旋转0 04.将SurfaceView与相机绑定 mCamera.setPreviewDisplay(mSurfaceView.getHolder()); // 绑定 mCamera.setPreviewCallback(mPreviewCallback); // 相机回调 mCamera.startPreview();// 启动相机 05..调用SDK进行人脸识别: // 相机实时数据回调 private Camera.PreviewCallback mPreviewCallback = new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { // 输出查看原始图像,确定原始图像角度,看需要旋转多少度得到正向图片。 imageView.setImageBitmap(DataToBitmap.nv21ToBitmap(getApplicationContext(), data, mWidth, mHeight)); // -------------------选择其中一个-------------------- /* * 参1:data源相机数据 * 参2:realTime : true 开启范围人脸监听。不传则为指定中心区域人脸识别 * width最佳宽度, * height最佳高度, * rotate对源数据旋转掰正的角度(8.1原始图像需旋转180度, 9.0不用旋转为0度), * numCallback 识别间隔,每次触发成功回调间隔(对该人脸识别 >numCallback 次时,取该次成功图片) */ // 首页 - 实时范围人脸监听 - Demo这里旋转角度以8.1系统为例旋转180° faceRecognitionData(data, true, mWidth, mHeight, 180, 3, new FaceDataCallback() { @Override public void onSuccess(final byte[] mNv21Data) { Log.i("aaaa", "--A数据:--" + mNv21Data.length); // 此处还算是子线程 i++; runOnUiThread(new Runnable() { @Override public void run() { mStr += "识别到人脸数据次数:" + i + "\n"; textView.setText(mStr); // imageView设置Bitmap: // DataToBitmap.nv21ToBitmap(getApplicationContext(), mNv21Data, // 640, 480); } }); } @Override public void onFail(int i) { // 实时范围识别中 - 该方法无用 } }); // 寻车 - 指定中心区域人脸识别 - 最多返回 3次 成功人脸- Demo这里旋转角度以8.1系统为例旋转180° faceRecognitionData(data, mWidth, mHeight, 180, 3, new FaceDataCallback() { @Override public void onSuccess(final byte[] bytes) { Log.i("aaaa", "--A页面数据:--" + bytes.length); i++; // 此处还算是子线程 runOnUiThread(new Runnable() { @Override public void run() { mStr += "识别到人脸数据次数:" + i + "\n"; textView.setText(mStr); // imageView设置Bitmap: // DataToBitmap.nv21ToBitmap(getApplicationContext(), bytes, // getFaceWidth(), getFaceHeight()) } }); } @Override public void onFail(int i) { // 实时范围识别中 - 该方法无用 } }); // -----SDK1.9新增方法 -- 灵活识别----- // 1. 传入正确方向的 全图 或 指定的区域 图像 faceRecognitionData(mBitmap, new FaceCallback() { @Override public void onSuccess(final byte[] mNv21Data, final List rect) { //2. byte[] mNv21Data:传入的Bitmap转换后的数据流,(Bitmap进去 = mNv21Data换个形态出来,质量不变) // List rect:人脸坐标( x/y/width/height )集合 if (rect.size() > 1) { // 3.多人脸,优先级:人脸越接近Bitmap中心点的优先级越高,排序靠前 // 4.根据 rect 扩大或缩小 从Bitmap/mNv21Data中裁切出相关人脸图形 } else { // 3.单人 // 4.根据 rect 扩大或缩小 从Bitmap/mNv21Data中裁切出相关人脸图形 // 例: runOnUiThread(new Runnable() { //回到主线程 @Override public void run() { int[] mRect = rect.get(0);// 得到单人脸 x/y/w/h Bitmap bitmap1 = DataToBitmap.nv21ToBitmap(getApplicationContext(), mNv21Data, w, h); // 根据 rect 在 传入源图像中 抠图 (不得超出源图像范围) // (可根据rect进行自我调节,抠图起点:x/y = mRect[0]/mRect[1] ,抠图宽高:width/height = mRect[2]/mRect[3]) Bitmap bitmap2 = Bitmap.createBitmap(bitmap1, mRect[0], mRect[1], mRect[2], mRect[3]); // 查看抠图image_text2.setImageBitmap(bitmap2); Log.i("aaaa", "识别到数据"); } }); } } }); } }; ===================================兼容9.0系统=SDK1.5使用方式↑============================================== 3.====================================SDK1.4使用方式↓============================================== 01.授权 private String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; 02.打开自定义Activity人脸识别界面,继承BaseFaceActivity 在onCreate()中初始默认参数: setContentView(R.layout.activity_xxx); /* * width最佳宽度, height最佳高度, rotate旋转掰正角度, * numCallback 识别间隔,每次触发成功回调间隔(对该人脸识别 >numCallback 次时,取该次成功图片) * frame 是否显示识别框 */ initFaceDefaultData(848, 480, 180, 10, true); .... 03.预览控件SurfaceView创建成功后初始化EGL和FRAME: mSurfaceView = findViewById(R.id.surface_view); .... @Override public void surfaceCreated(final SurfaceHolder holder) { // 初始EGL和FRAME initEgl_Frame(holder.getSurface()); // 打开相机 initCamera(); } 04.获取到相机对象后设置: mCamera.setPreviewTexture(getSurfaceTextures()); parameters.setPreviewSize(getPrivate_Width(), getPrivate_Height()); // 设置最终的预览尺寸。与setDefaultData设置的尺寸一致 parameters.setPictureSize(1920, 1080); // 设置最终的图片尺寸 05..配置相机,相机预览角度旋转180度 mCamera.setDisplayOrientation(getmRotate());// 预览视图方向 旋转180 06..设置相机数据回调PreviewCallback ,调用人脸识别; // 相机实时数据回调 private Camera.PreviewCallback mPreviewCallback = new Camera.PreviewCallback() { @Override public void onPreviewFrame(byte[] data, Camera camera) { // 选择其一 // 实时范围人脸监听 - 首页 - realTime:true /* faceRecognitionData(data, true, new FaceDataCallback() { @Override public void onSuccess(final byte[] mNv21Data) { Log.i("aaaa", "--A数据:--" + mNv21Data.length); // 此处还算是子线程 i++; runOnUiThread(new Runnable() { @Override public void run() { textView.setText("识别到人脸数据次数:" + i); // imageView设置Bitmap: // DataToBitmap.nv21ToBitmap(getApplicationContext(), mNv21Data, // getPrivate_Width(), getPrivate_Height()); } }); } }); */ // 指定中心区域人脸识别 - 寻车 - 最多返回 3次 成功人脸 faceRecognitionData(data, new FaceDataCallback() { @Override public void onSuccess(final byte[] bytes) { Log.i("aaaa", "--A页面数据:--" + bytes.length); i++; // 此处还算是子线程 runOnUiThread(new Runnable() { @Override public void run() { textView.setText("识别到人脸数据次数:" + i); // imageView设置Bitmap: // DataToBitmap.nv21ToBitmap(getApplicationContext(), mNv21Data, // getFaceWidth(), getFaceHeight()) } }); } }); } }; ===================================8.1系统=SDK1.4使用方式↑============================================== 5..获得 byte[] bytes 数据后可通过内置工具解析成Bitmap: 实时范围识别使用: DataToBitmap.nv21ToBitmap(getApplicationContext(), bytes, 640, 480) 指定中心区域人脸识别使用: DataToBitmap.nv21ToBitmap(getApplicationContext(), bytes, getFaceWidth(), getFaceHeight()) 6..界面不可见时,先关闭相机,并 释放人脸识别 @Override protected void onPause() { // Log.i("aaaa", "界面不可见"); // 关闭相机 if (mCamera != null) { mCamera.setPreviewCallback(null); mCamera.stopPreview(); mCamera.release(); mCamera = null; } // 释放人脸识别 super.onPause(); } 7..当主进程关闭或者确定不在使用人脸识别时,彻底关闭人脸识别 FaceTrackingUtils.closeFaceRecognition();彻底关闭人脸识别!!! @Override protected void onDestroy() { super.onDestroy(); FaceTrackingUtils.closeFaceRecognition(); } 8.================跨进程=================== 若识别界面有其他资源内存需求大,可开启新进程打开识别界面 方法:在 AndroidManifest.xml 的Activity中加入 android:process=":face 打开识别界面CustomActivity后将处于新的进程空间,数据传输到Main主进程需要进行跨进程操作。 如果无需传输数据到Main主进程 则在子进程中处理操作即可。 #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)