有一两个月没有更新博客了,最近一直在忙人脸识别的项目,先将项目中更改虹软人脸框的方法抽取出来,希望对大家有所帮助。

尊重原创,转载请注明出处: http://blog..net/qq137722697

为什么要改?

先来看看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();

}

}

尊重原创,转载请注明出处:大力哥的博客( http://blog..net/qq137722697)

Android自定义人脸识别框,android自定义虹软人脸识别框/人脸抓拍框/人脸追踪框...相关推荐

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

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

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

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

  3. Android人脸识别开发入门--基于虹软免费SDK实现

    转自:http://blog.csdn.net/feishixin/article/details/77718680 引言 人工智能时代快速来临,其中人脸识别是当前比较热门的技术,在国内也越来越多的运 ...

  4. Android自定义弹窗模仿微信,Android 仿微信朋友圈点赞和评论弹出框功能

    本文简单模仿微信朋友圈的点赞和评论弹出框,布局等细节请忽略,着重实现弹出框.发评论,及弹出位置的控制. 1. 微信弹出框 微信朋友圈的点赞和评论功能,有2个组成部分: 点击左下角的"更多&q ...

  5. Android仿微信朋友圈2自定义点赞评论弹框

    最近在做类似微信朋友圈点赞评论的功能,有个点赞评论弹框交互,感觉效果很好,点击评论按钮弹框从按钮左边弹出,遇到了3个问题(弹出动画不对.弹框布局没有适配.弹出的位置显示不对),动画和布局好解决,弹出的 ...

  6. 虹软android实现人脸比对,[Android]虹软arcface人脸识别SDK引擎使用总结

    虹软开放了人脸识别的SDK引擎(免费的哦),刚好有Android版的,就体验了一波.下面来说说Android版的SDK使用心得: ArcFace 虹软人脸认知引擎简介 目前开放的版本有人脸比对(1:1 ...

  7. android人脸识显示头像自定义,Android 仿QQ头像自定义截取功能

    看了Android版QQ的自定义头像功能,决定自己实现,随便熟悉下android绘制和图片处理这一块的知识. 先看看效果: 思路分析: 这个效果可以用两个View来完成,上层View是一个遮盖物,绘制 ...

  8. Android仿IOS封装通用的弹出框Dialog和底部弹出列表选择框 仿美团顶部条件筛选框 附自定义ViewGroup

    弹出框 背景 提示与询问弹出框 实现 使用 列表选择框 实现 使用 顶部条件筛选框 实现 自定义ViewGroup 使用 总结 背景 鉴于Android提供的默认弹出框很一般,IOS的弹出框样式还不错 ...

  9. Android 验证码和密码输入框,能自定义输入框个数和样式(连体,下划线和方形框) 类似微信支付宝的密码输入框等

    MNPasswordEditText 项目地址:maning0303/MNPasswordEditText  简介: Android 验证码和密码输入框,能自定义输入框个数和样式(连体,下划线和方形框 ...

最新文章

  1. python3 字符串 列表 字典 转换
  2. 取景框图片 小程序_敲敲级简单的鉴别H图片的小程序
  3. NETCF平台下利用XmlSerializer对于复杂类型序列化的探索(三)
  4. Servlet优化之BaseServlet
  5. JavaFX快速入门完整代码:点击按钮显示当前系统时间示例
  6. Flink 靠什么征服饿了么工程师?
  7. echarts实现双Y轴之散点和折线图
  8. Android OTA升级(1):编译升级全包
  9. Linux下mysql主从同步备份master-slave详细配置
  10. 分析网络故障慢慢来!一定要抓到真凶(有关arp)
  11. office2007怎么卸载干净?
  12. 第三方支付接口现号,第三方支付接口对接,第三方支付接口申请
  13. Transforms的使用
  14. 【思维导图】LAMPer技能树
  15. 2020年中级数据库系统工程师考试笔记9—SQL语言
  16. LQ0139 油漆面积【枚举】
  17. 用Java语句判断一个数字是不是7的倍数
  18. linux服务器网络不稳定,Linux服务器故障排查指南7:网络缓慢状况
  19. Android 蓝牙手柄连接流程解析和自动化方案
  20. sublime的一些使用技巧

热门文章

  1. 电话用计算机接听,怎么用电脑打电话-现在你可以在电脑上接听安卓手机的电话了...
  2. 【Java岗】9月华为校招+阿里巴巴社招完整面经
  3. ORAN专题系列-29:运营商O-RAN扩展皮站测试的硬件架构
  4. 【ArcGIS】利用字段计算器按 OSM 道路等级生成道路速度
  5. 计算机科学中的数学(一)
  6. 用Python的matplotlib绘制残差分析散点误差棒图
  7. SpringBoot 项目修改html后不需要重新启动(热部署)
  8. 重庆html5全景,用pano2vr 转swf 全景图
  9. pdf怎么提取页面,pdf页面提取方法
  10. Windows11自带壁纸位置