为什么要改?

先来看看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中提供的人脸框样式,这个框看上去并不是非常美观(个人觉得) 在这里插入图片描述 再看看下面这个框是不是就要顺眼一点 在这里插入图片描述 怎么换? 先来看看原始的画 ...

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

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

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

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

  4. android 弹窗有边框_android中常用的弹出提示框

    我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的朋友都会知道,大部分的平台都只提供了几个最简单的实现,如果我们想实现自己特定需求的对话框,大家可能首先会想到,通过继承等 ...

  5. android 人脸识别边框_人脸框抠图如何实现

    最近在尝试做一个人脸识别项目,在对比几款主流人脸识别SDK后,采用了虹软的Arcface SDK,因为它提供了免费版本,并且可以离线使用,接入难度也比较低.项目中有一个需求就是显示检测到的人脸,但是如 ...

  6. android 人脸识别边框_【技术分享】虹软人脸识别 - Android Camera实时人脸追踪画框适配...

    在使用虹软人脸识别Android SDK的过程中 ,预览时一般都需要绘制人脸框,但是和PC平台相机应用不同,在Android平台相机进行应用开发还需要考虑前后置相机切换.设备横竖屏切换等情况,因此在人 ...

  7. 人脸识别算法虹软arcface和Dlib对比

    我司最近要做和人脸识别相关的产品,原来使用的是其他的在线平台,识别率和识别速度很满意,但是随着量起来的话,成本也是越来越不能接受(目前该功能我们是免费给用户使用的),而且一旦我们的设备掉线了就无法使用 ...

  8. 基于ONNX人脸识别实例(SCRFD/ArcFace)-Python版

    人脸识别三步:人脸检测.人脸对齐.特征提取. 一.依赖包 numpy==1.18.0 onnxruntime==1.13.1 onnxruntime_directml==1.10.0 opencv_p ...

  9. 【人脸识别】MTCNN + Arcface全流程详解 Pytorch代码 损失函数发展

    目录: 人脸识别介绍 损失函数发展 Softmax loss Center loss Triplet loss L-softmax loss SphereFace(A-Softmax loss) Co ...

最新文章

  1. Symantec Endpoint - quarantine
  2. 两物体的相对速度公式_最全物理公式合集,高考这一份就够了!
  3. 数据库关机_数据库:MySQL常见的三种存储引擎InnoDB、MyISAM、MEMORY的区别?
  4. Linux内核线程kernel thread详解--Linux进程的管理与调度
  5. Base64编码解码原理
  6. 带注释源码php,php的注释方法
  7. java hashmap 去重_java数组去重的两种方法
  8. CSDN审核机制有点迷惑,决定逐步搬迁到简书
  9. iOS项目内购(IAP)纯代码
  10. 计算机网络高级软件编程技术
  11. Java 产品与软件下载
  12. 论文中的Matlab画图常用技巧
  13. hp probook fn_如何在HP ProBook(或兼容笔记本电脑)上安装Mac OS X Lion
  14. DirectX11 SDK 下载地址
  15. 计算机系毕业论文ppt模板,计算机专业答辩PPT模板.ppt
  16. 炫酷好玩好用的卫星全景地图
  17. 水果忍者腾讯版 v1.0.2 官方安卓版下载
  18. Android字体、字重
  19. Unity2D入门(二):图层layer和角色建立
  20. 超声波传感器(CHx01) 学习笔记 Ⅴ- 参数配置

热门文章

  1. opensip db mysql_opensip和opensip_cp安装配置
  2. android在特定时间,如何在Android Oreo的特定时间在Android上发出通知?
  3. C语言数组相似度比对,某课程设计---文件相似度判断
  4. linux视频在windows播放器,适用于Windows和Linux的免费多媒体播放器SMPlayer 18.6.0发布 - 爱绿豆...
  5. 最全Java面试180题:阿里11面试+网易+百度+美团!含答案大赠送!
  6. Restful、SOAP、RPC、SOA、微服务之间的区别
  7. 论文小综 | Attention in Graph Neural Networks
  8. 技术动态 | 67 亿美金搞个图,创建知识图谱的成本有多高你知道吗?
  9. 7、JPA-映射-双向一对多
  10. 第五十四篇 Linux相关——远程连接SSH