虹软人脸识别sdk使用-android(二)

虹软人脸识别sdk使用-android(一)在这篇文章中简单的介绍了如何接入SDK,以及如何使用虹软的一些接口,这篇主要介绍如何接入人脸识别框

如何去画人脸框,这里有两种方法,第一种是获得人脸识别后的图像的坐标,然后自己去画Rect,第二种是直接用虹软的人脸框,移植到自己的项目中

一、获得人脸坐标(未完成)

首先我们可以自行查看人脸的坐标,以及或得人脸识别追踪后的画面

人脸坐标:这里展示的显示一个人脸的坐标

 1 /*
 2                 * 1.6日人脸框实现
 3                 * */
 4                 Rect rect = faceInfoList.get(0).getRect();
 5 
 6                 //////这些新的坐标是对的;划重点
 7                 rect1 = adjustRect(rect, previewSize.width, previewSize.height, mAspectLayout.getWidth(), mAspectLayout.getHeight(), 90, Camera.CameraInfo.CAMERA_FACING_FRONT, false, false, false);
 8 
 9 
10                 /*
11                  * whq1.5日修改,我现在需要将bitmap提取出来,通过NV21来提取
12                  * */
13 
14                 Bitmap bitmap = nv21ToBitmap(nv21, previewSize.width, previewSize.height);
15 
16 
17                 Bitmap bitmap1 = Bitmap.createBitmap(bitmap, rect.left, rect.top,rect.right - rect.left,rect.bottom - rect.top);
18 
19                 ///存人脸框
20                 getRGBData(bitmap1);
21                  Log.i(TAG, "faceInfoList: " + faceInfoList);
22                 Log.i(TAG, "Rect的top: " + faceInfoList.get(0).getRect().top);
23                 Log.i(TAG, "Rect的left: " + faceInfoList.get(0).getRect().left);
24                 Log.i(TAG, "Rect的bottom: " + faceInfoList.get(0).getRect().bottom);
25                 Log.i(TAG, "Rect的right: " + faceInfoList.get(0).getRect().right);

 

这里是对应的打印值,这里的rect的坐标点找到

 

 

但是不能对这四个点就行画人脸框,需要重新运算一下,获得rect:

 1 /*
 2     * 1.6日虹软人脸框设计
 3     * */
 4 
 5     public Rect adjustRect(Rect ftRect,int mpreviewWidth,int mpreviewHeight, int mcanvasWidth,int mcanvasHeight,int mcameraDisplayOrientation,int mcameraId,boolean misMirror,boolean mmirrorHorizontal,boolean mmirrorVertical) {
 6 
 7         int previewWidth = mpreviewWidth;
 8         int previewHeight = mpreviewHeight;
 9         int canvasWidth = mcanvasWidth;
10         int canvasHeight = mcanvasHeight;
11         int cameraDisplayOrientation = mcameraDisplayOrientation;
12         int cameraId = mcameraId;
13         boolean isMirror = false;
14         boolean mirrorHorizontal = false;
15         boolean mirrorVertical = false;
16 
17         if (ftRect == null) {
18             return null;
19         }
20 
21         Rect rect = new Rect(ftRect);
22         float horizontalRatio;
23         float verticalRatio;
24         if (cameraDisplayOrientation % 180 == 0) {
25             horizontalRatio = (float) canvasWidth / (float) previewWidth;
26             verticalRatio = (float) canvasHeight / (float) previewHeight;
27         } else {
28             horizontalRatio = (float) canvasHeight / (float) previewWidth;
29             verticalRatio = (float) canvasWidth / (float) previewHeight;
30         }
31         rect.left *= horizontalRatio;
32         rect.right *= horizontalRatio;
33         rect.top *= verticalRatio;
34         rect.bottom *= verticalRatio;
35 
36         Rect newRect = new Rect();
37         switch (cameraDisplayOrientation) {
38             case 0:
39                 if (cameraId == Camera.CameraInfo.CAMERA_FACING_FRONT) {
40                     newRect.left = canvasWidth - rect.right;
41                     newRect.right = canvasWidth - rect.left;
42                 } else {
43                     newRect.left = rect.left;
44                     newRect.right = rect.right;
45                 }
46                 newRect.top = rect.top;
47                 newRect.bottom = rect.bottom;
48                 break;
49             case 90:
50                 newRect.right = canvasWidth - rect.top;
51                 newRect.left = canvasWidth - rect.bottom;
52                 if (cameraId == Camera.CameraInfo.CAMERA_FACING_FRONT) {
53                     newRect.top = canvasHeight - rect.right;
54                     newRect.bottom = canvasHeight - rect.left;
55                 } else {
56                     newRect.top = rect.left;
57                     newRect.bottom = rect.right;
58                 }
59                 break;
60             case 180:
61                 newRect.top = canvasHeight - rect.bottom;
62                 newRect.bottom = canvasHeight - rect.top;
63                 if (cameraId == Camera.CameraInfo.CAMERA_FACING_FRONT) {
64                     newRect.left = rect.left;
65                     newRect.right = rect.right;
66                 } else {
67                     newRect.left = canvasWidth - rect.right;
68                     newRect.right = canvasWidth - rect.left;
69                 }
70                 break;
71             case 270:
72                 newRect.left = rect.top;
73                 newRect.right = rect.bottom;
74                 if (cameraId == Camera.CameraInfo.CAMERA_FACING_FRONT) {
75                     newRect.top = rect.left;
76                     newRect.bottom = rect.right;
77                 } else {
78                     newRect.top = canvasHeight - rect.right;
79                     newRect.bottom = canvasHeight - rect.left;
80                 }
81                 break;
82             default:
83                 break;
84         }
85 
86         return newRect;
87     }

进行打印

1                 //打印新的坐标,这些新的坐标是对的;划重点
2                 Log.i(TAG, "Rect1的top: " + rect1.top);
3                 Log.i(TAG, "Rect1的left: " + rect1.left);
4                 Log.i(TAG, "Rect1的bottom: " + rect1.bottom);
5                 Log.i(TAG, "Rect1的right: " + rect1.right);

 

这是打印值

 

 

 接下来对这四个点进行画rect矩形框

 1 package com.example.camera;
 2 
 3 
 4 import android.content.Context;
 5 import android.graphics.Canvas;
 6 import android.graphics.Paint;
 7 import android.graphics.Rect;
 8 import android.view.View;
 9 import android.graphics.Color;
10 import android.util.AttributeSet;
11 
12 public class DrawViewTest extends View{
13 
14     private Paint mPaint;
15 
16     public DrawViewTest(Context context) {
17         super(context);
18         init();
19     }
20 
21 
22     public DrawViewTest(Context context, AttributeSet attrs) {
23         super(context, attrs);
24         init();
25     }
26 
27     public DrawViewTest(Context context, AttributeSet attrs, int defStyleAttr) {
28         super(context, attrs, defStyleAttr);
29         init();
30     }
31 
32 
33 
34     private void init(){
35         mPaint = new Paint();
36         mPaint.setAntiAlias(true);          //抗锯齿
37         mPaint.setColor(Color.YELLOW);        //画笔颜色,红色
38         mPaint.setStyle(Paint.Style.STROKE);  //画笔风格
39         mPaint.setTextSize(36);             //绘制文字大小,单位px
40         mPaint.setStrokeWidth(5);           //画笔粗细
41     }
42 
43     //重写该方法,在这里绘图
44     @Override
45     protected void onDraw(Canvas canvas) {
46         super.onDraw(canvas);
47         drawable(canvas);
48         invalidate();
49     }
50 
51     public void drawable(Canvas canvas) {
52 
53 
54 
55         canvas.drawColor(Color.RED);
56 //        // 画实心圆
57 //        canvas.drawCircle(200, 200, 100, mPaint);
58         // 画矩形
59 
60         canvas.drawRect(107, 708, 822, 1404, mPaint);///这里的四个点就是转化后的四个点
61 
62     }
63 
64 }
 1 package com.example.camera;
 2 
 3 import androidx.appcompat.app.AppCompatActivity;
 4 
 5 import android.content.Intent;
 6 import android.graphics.Canvas;
 7 import android.graphics.Color;
 8 import android.graphics.Paint;
 9 import android.graphics.Rect;
10 import android.os.Bundle;
11 import android.util.Log;
12 import android.view.Window;
13 import android.view.WindowManager;
14 
15 public class Main2Activity extends AppCompatActivity {
16 
17     private static final String TAG = "Main2Activity";
18 
19     private Paint mPaint;
20 
21     @Override
22     protected void onCreate(Bundle savedInstanceState) {
23         super.onCreate(savedInstanceState);
24         requestWindowFeature(Window.FEATURE_NO_TITLE);
25         getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
26                 WindowManager.LayoutParams.FLAG_FULLSCREEN);
27 
28 
29         Intent intent = getIntent();
30         int[] rects = intent.getIntArrayExtra("rect");
31         Rect rect = new Rect();
32         rect.set(rects[1],rects[0],rects[3],rects[2]);
33         Log.i(TAG, "onCreate: "+rects[0]);
34         Log.i(TAG, "onCreate: "+rects[1]);
35         Log.i(TAG, "onCreate: "+rects[2]);
36         Log.i(TAG, "onCreate: "+rects[3]);
37 
38         setContentView(new DrawViewTest(Main2Activity.this));
39     }
40 
41     public void drawrect(Rect rect){
42 
43         int left = rect.left;
44         int top = rect.top;
45         int right = rect.right;
46         int bootom = rect.bottom;
47 
48         mPaint = new Paint();
49         mPaint.setAntiAlias(true);          //抗锯齿
50         mPaint.setColor(Color.YELLOW);        //画笔颜色,红色
51         mPaint.setStyle(Paint.Style.STROKE);  //画笔风格
52         mPaint.setTextSize(36);             //绘制文字大小,单位px
53         mPaint.setStrokeWidth(5);           //画笔粗细
54 
55         Canvas canvas = new Canvas();
56         canvas.drawColor(Color.RED);
57 
58         canvas.drawRect(left, top, right, bootom, mPaint);
59 
60     }
61 
62 }

使用Main2Activity对这四个点进行画矩形框发现是对的。所以必须对rect的四个点进行转化才能画框 。剩下的请读者自行实现

二、移植虹软的人脸框

1、添加文件

 

 

 添加如下这几个文件。

2、布局文件

布局文件更改为:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     tools:context=".MainActivity_l">
 7 
 8     <FrameLayout
 9         android:id="@+id/layout_aspect"
10         android:layout_width="match_parent"
11         android:layout_height="wrap_content">
12 
13     </FrameLayout>
14 
15     <com.example.camera.widget.FaceRectView
16         android:id="@+id/face_rect_view"
17         android:layout_width="match_parent"
18         android:layout_height="match_parent" />
19 
20 
21 
22     <LinearLayout
23         android:layout_width="match_parent"
24         android:layout_height="wrap_content"
25         android:orientation="horizontal"
26         android:layout_gravity="top"
27         android:gravity="center">
28         <TextView
29             android:id="@+id/face_num"
30             android:layout_width="100dp"
31             android:layout_height="50dp"
32             android:text="人脸数:--"
33             android:textColor="#000000"
34             />
35         <TextView
36             android:id="@+id/age"
37             android:layout_width="100dp"
38             android:layout_height="50dp"
39             android:layout_toRightOf="@id/face_num"
40             android:text="年龄:--"
41             android:textColor="#000000"
42             />
43         <TextView
44             android:id="@+id/gender"
45             android:layout_width="100dp"
46             android:layout_height="50dp"
47             android:layout_toRightOf="@id/age"
48             android:text="性别:--"
49             android:textColor="#000000"
50             />
51         <TextView
52             android:id="@+id/liveness"
53             android:layout_width="100dp"
54             android:layout_height="50dp"
55             android:layout_toRightOf="@id/gender"
56             android:text="活体:--"
57             android:textColor="#000000"
58             />
59 
60     </LinearLayout>
61 
62 
63     <LinearLayout
64         android:layout_width="match_parent"
65         android:layout_height="wrap_content"
66         android:orientation="horizontal"
67         android:layout_gravity="bottom"
68         android:gravity="center">
69         <Button
70             android:id="@+id/btn_init"
71             android:layout_width="wrap_content"
72             android:layout_height="wrap_content"
73             android:text="初始化" />
74 
75         <Button
76             android:id="@+id/btn_switch"
77             android:layout_width="wrap_content"
78             android:layout_height="wrap_content"
79             android:text="切换相机" />
80         <Button
81             android:id="@+id/btn_focus"
82             android:layout_width="wrap_content"
83             android:layout_height="wrap_content"
84             android:onClick="focus"
85             android:text="聚焦" />
86 
87         <Button
88             android:id="@+id/btn_facerect"
89             android:layout_width="wrap_content"
90             android:layout_height="wrap_content"
91             android:onClick="facerect"
92             android:text="人脸框" />
93 
94 
95     </LinearLayout>
96 
97 </FrameLayout>
View Code

3、对FaceRectView就行画框

在initView()中添加:

1 /*
2         * 1.12人脸识别框
3         * */
4         faceRectView = findViewById(R.id.face_rect_view);//

在init()中添加更改为:

 1  /*
 2          * 检测属性
 3          * */
 4 
 5         Camera camera = CameraUtils.getmCamera();
 6 
 7         /*
 8          * 1.12whq人脸框
 9          * */
10 
11         previewSize = camera.getParameters().getPreviewSize();
12         drawHelper = new DrawHelper(previewSize.width, previewSize.height, mCameraSurfaceView.getWidth(), mCameraSurfaceView.getHeight(), 90
13                 , 1, false, false, false);
14 
15 
16 
17 
18 
19          /*
20                  * 1.12人脸框
21                  * */
22                 if (faceRectView != null && drawHelper != null && faceInfoList.size()>0 && genderInfoList.size()>0 && ageInfoList.size()>0 && livenessInfoList.size()>0) {
23                     List<DrawInfo> drawInfoList = new ArrayList<>();
24                     //System.out.println("参数的数量是:"+ faceInfoList.size());
25                     for (int i = 0; i < faceInfoList.size(); i++) {
26                         drawInfoList.add(new DrawInfo(drawHelper.adjustRect(faceInfoList.get(i).getRect()), genderInfoList.get(i).getGender(), ageInfoList.get(i).getAge(), livenessInfoList.get(i).getLiveness(), RecognizeColor.COLOR_UNKNOWN, null));
27                     }
28                     drawHelper.draw(faceRectView, drawInfoList);
29                 }

添加这两处代码即可

4、查看人脸追踪后的照片

1 String image_test;////用于保存图片
2 
3          /*
4          * 用于保存图片
5          * */
6         String rootDir = MainActivity_l.this.getExternalFilesDir("pic").getAbsolutePath();
7         image_test = rootDir + "/test.png";        
 1   /*
 2      *whq 保存照片
 3      * */
 4 
 5     private void getRGBData(Bitmap bitmap) {
 6         File file = new File(image_test);
 7         try {
 8             file.createNewFile();
 9             FileOutputStream fos = new FileOutputStream(file);
10             bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
11             fos.close();
12         } catch (IOException e) {
13             e.printStackTrace();
14         }
15 
16 
17     }

在安卓的文件管理中找到data,找到这个APP的包的全名,然后一点一点找到,就会发现里面存着人脸的识别后的照片。

以上就是完成了人脸检测及追踪。

完整的代码链接:https://download.csdn.net/download/hequnwang10/14150596

posted @ 2021-01-13 22:32  wangheq  阅读(749)  评论(0编辑  收藏  举报