为什么要改?

先来看看sdk demo中提供的人脸框样式,这个框看上去并不是非常美观(个人觉得)

在这里插入图片描述

再看看下面这个框是不是就要顺眼一点

在这里插入图片描述

怎么换?

先来看看原始的画法:

@Override

public void onAfterRender(CameraFrameData data) {

mGLSurfaceView.getGLES2Render().draw_rect((Rect[]) data.getParams(), Color.GREEN, 2);

}

其实更换人脸识别框是非常简单的,因为虹软的人脸识别sdk已经将人脸的位置回调出来了,实时回调的是一个Rect(将回调出来的CameraFrameData强转一下即可),既然都知道人脸框的位置,那就是一个自定义View就解决的事了。

只需要在onDraw方法中画八条线即可

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

if (rect != null) {

/**

* 左上角的竖线

*/

canvas.drawLine(rect.left, rect.top, rect.left, rect.top + 20, mPaint);

/**

* 左上角的横线

*/

canvas.drawLine(rect.left, rect.top, rect.left + 20, rect.top, mPaint);

/**

* 右上角的竖线

*/

canvas.drawLine(rect.right, rect.top, rect.right - 20, rect.top, mPaint);

/**

* 右上角的横线

*/

canvas.drawLine(rect.right, rect.top, rect.right, rect.top + 20, mPaint);

/**

* 左下角的竖线

*/

canvas.drawLine(rect.left, rect.bottom, rect.left, rect.bottom - 20, mPaint);

/**

* 左下角的横线

*/

canvas.drawLine(rect.left, rect.bottom, rect.left + 20, rect.bottom, mPaint);

/**

* 右下角的竖线

*/

canvas.drawLine(rect.right, rect.bottom, rect.right, rect.bottom-20, mPaint);

/**

* 右下角的横线

*/

canvas.drawLine(rect.right, rect.bottom, rect.right-20, rect.bottom , mPaint);

}

}

这里其实还有一个坑,就是这个Rect是相对于相机分辨率的,但是如果摄像头的预览分辨率不等于画布的大小就会出现错位的情况,比如下面的情况:(绿框是虹软demo中的人脸框,蓝色框是自定义的框)

在这里插入图片描述

怎么解决呢?你应该想到了,将宽高等比例缩放一下即可,所以提供画人脸框的一个方法:

/**

* 开始画矩形框

*

* @param rect1

*/

public void drawFaceRect(Rect rect1) {

this.rect = rect1;

//将屏幕人脸框转换为视频区域的人脸框

rect.left = rect.left * getWidth() / screenHeight+20;

rect.right = rect.right * getWidth() / screenHeight+40;

rect.top = rect.top * getHeight() / screenHeight+30;

rect.bottom = rect.bottom * getHeight() / screenHeight+75;

//在主线程发起绘制请求

postInvalidate();

}

注意:此处的+20,+40,+30,+75都是经验值,都是相对于左上右下的位置,可根据自己的设备做微调。

此外我们还需要提供一个清除人脸框的方法(没有识别到人脸的时候框要消失):

public void clearRect() {

rect = null;

postInvalidate();

}

下面是本View完整的代码(只是demo,还有优化的地方,只是提供一种思路,思路理解了,还可以画很多炫酷的框):

/**

* 自定义虹软人脸识别框/人脸抓拍框/人脸追踪框

* Created by HDL on 2018/7/31.

*/

public class FaceRectView extends View {

private Rect rect;

private int screenWidth;

private int screenHeight;

public FaceRectView(Context context) {

this(context, null);

}

public FaceRectView(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public FaceRectView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

screenWidth = wm.getDefaultDisplay().getWidth();

screenHeight = wm.getDefaultDisplay().getHeight();

initPaint(context);

}

private void initPaint(Context context) {

mPaint = new Paint();

mPaint.setAntiAlias(true);

mPaint.setStrokeWidth(3);

mPaint.setColor(context.getResources().getColor(R.color.color_face_rect));

}

private Paint mPaint;

/**

* 开始画矩形框

*

* @param rect1

*/

public void drawFaceRect(Rect rect1) {

this.rect = rect1;

//将屏幕人脸框转换为视频区域的人脸框

rect.left = rect.left * getWidth() / screenHeight+20;

rect.right = rect.right * getWidth() / screenHeight+40;

rect.top = rect.top * getHeight() / screenHeight+30;

rect.bottom = rect.bottom * getHeight() / screenHeight+75;

//在主线程发起绘制请求

postInvalidate();

}

public void clearRect() {

rect = null;

postInvalidate();

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

if (rect != null) {

/**

* 左上角的竖线

*/

canvas.drawLine(rect.left, rect.top, rect.left, rect.top + 20, mPaint);

/**

* 左上角的横线

*/

canvas.drawLine(rect.left, rect.top, rect.left + 20, rect.top, mPaint);

/**

* 右上角的竖线

*/

canvas.drawLine(rect.right, rect.top, rect.right - 20, rect.top, mPaint);

/**

* 右上角的横线

*/

canvas.drawLine(rect.right, rect.top, rect.right, rect.top + 20, mPaint);

/**

* 左下角的竖线

*/

canvas.drawLine(rect.left, rect.bottom, rect.left, rect.bottom - 20, mPaint);

/**

* 左下角的横线

*/

canvas.drawLine(rect.left, rect.bottom, rect.left + 20, rect.bottom, mPaint);

/**

* 右下角的竖线

*/

canvas.drawLine(rect.right, rect.bottom, rect.right, rect.bottom-20, mPaint);

/**

* 右下角的横线

*/

canvas.drawLine(rect.right, rect.bottom, rect.right-20, rect.bottom , mPaint);

}

}

}

2018.9.27更新

有小伙伴不知道怎么使用,只需要在onAfterRender回调中使用即可

@Override

public void onAfterRender(CameraFrameData data) {

params = (Rect[]) data.getParams();

if (params.length > 0) {

param = params[0];

faceRectView.drawFaceRect(param);

} else {

faceRectView.clearRect();

}

}

android 人脸识别边框_android自定义Arcface人脸识别框/人脸抓拍框/人脸追踪框相关推荐

  1. android 人脸识别边框_android Arcface人脸识别框/人脸抓拍框/人脸追踪框

    为什么要改? 先来看看sdk demo中提供的人脸框样式,这个框看上去并不是非常美观(个人觉得) 再看看下面这个框是不是就要顺眼一点 怎么换? 先来看看原始的画法: @Override public ...

  2. Android自定义人脸识别框,android自定义虹软人脸识别框/人脸抓拍框/人脸追踪框...

    有一两个月没有更新博客了,最近一直在忙人脸识别的项目,先将项目中更改虹软人脸框的方法抽取出来,希望对大家有所帮助. 尊重原创,转载请注明出处: http://blog..net/qq137722697 ...

  3. android指定sqlite路径_Android:自定义Sqlite数据库路径

    默认的sqlite数据库是放在/data/data/database目录下的,今天看腾讯云IM的demo发现再该路径下找不到它存放消息的数据库,找了下后发现居然是放在/data/data/files目 ...

  4. android 弹窗有边框_Android 多种简单的弹出框样式设置代码

    简介 这是一个基于AlertDialog和Dialog这两个类封装的多种弹出框样式,其中提供各种简单样式的弹出框使用说明.同时也可自定义弹出框. 特性 1.使用链式开发代码简洁明了 2.所有的弹出框样 ...

  5. android imageview 加边框,RCImageView 自定义圆角ImageView,带边框效果

    概况 RCImageView 圆型或者圆角图片(带有边框效果),适配了ImageView的ScaleType属性 RoundImageView 定义圆角图片,四个角圆角弧度可各自定义,也可不定义默认角 ...

  6. android canvas绘制圆角_Android自定义View撸一个渐变的温度指示器(TmepView)

    秦子帅明确目标,每天进步一点点..... 作者 |  andy 地址 |  blog.csdn.net/Andy_l1/article/details/82910061 1.概述 自定义View对需要 ...

  7. android绘制心形_Android自定义View系列(一)——打造一个爱心进度条

    写作原因:Android进阶过程中有一个绕不开的话题--自定义View.这一块是安卓程序员更好地实现功能自主化必须迈出的一步.下面这个系列博主将通过实现几个例子来认识安卓自定义View的方法.从自定义 ...

  8. android 图片圆角 遮罩_Android 自定义View练手Demo(一)实现圆角遮罩效果

    Android 自定义View系列文章 Android自定义View实现圆角遮罩效果 一图胜千言,有一个遮罩就会凸显出重点区域 1-1.jpg 本文通过两种方式来实现这种效果,来达到自定义View练手 ...

  9. android录音波浪动画_Android自定义View实现波浪动画

    本文实例为大家分享了Android自定义View实现波浪动画的具体代码,供大家参考,具体内容如下 效果演示 代码调用与实现效果 xml中调用 android:layout_width="ma ...

最新文章

  1. search result
  2. Serializable接口中serialVersionUID字段的作用
  3. SpringBoot精选项目
  4. Shell 脚本案例实战 [4]
  5. IHttpModule接口事件执行 获取Session .
  6. 娱乐而已,认真你就输了
  7. TreeMap集合怎样依照Value进行排序
  8. 使用vfork、exec系列函数、wait/waited实现system函数的功能
  9. python:二.Python教程
  10. linux各种一句话反弹shell总结
  11. 广东电网携手华为,为“数字电网”建设提供有力支撑
  12. Problem : [usaco2007 Feb]Lilypad Pond
  13. 云日记结构bug心得
  14. java导出excel文件到服务器,javaexcel导出到远程服务器
  15. 原创记忆小游戏-HTML网页版
  16. 思科AC无线控制器AIR-CT2504-K9修改Wi-Fi密码
  17. 物联网下的智慧交通系统
  18. matlab学习记录
  19. VC6.0配置OpenGL
  20. Lazada代运营干货分享:Lazada店铺活动如何设置Feed

热门文章

  1. 七年级计算机学期教学要求,七年级信息技术教学工作总结
  2. C# 开发的网络数据包抓取的的实现
  3. 为什么大数据工程师比Java程序员工资高50%?
  4. 使用MODBUS转PROFINET智能网关实现与多个温控器数据读写
  5. 学会ipad当作电脑扩展屏方法
  6. 二维码门禁(基于微信小程序)
  7. 字节跳动 文林福_AI实力赋能,让汽车营销玩出抖音范
  8. PAT 甲级 1018 Public Bike Management
  9. 给SSD(固态硬盘)编程
  10. 1062: 最大公约数 Python