android人脸抠图,人脸框抠图如何实现
最近在尝试做一个人脸识别项目,在对比几款主流人脸识别SDK后,采用了虹软的Arcface SDK,因为它提供了免费版本,并且可以离线使用,接入难度也比较低。项目中有一个需求就是显示检测到的人脸,但是如何从一张图片中抠取合适大小的人脸呢?本文将从以下步骤来介绍如何实现:
1. 如何获得人脸框
2. 如何根据人脸框裁剪
3. 如何进行结果图旋转
4. 应用场景举例
1. 如何获得人脸框
首先我们来看一下虹软Android ArcFace SDK用于人脸检测的detectFaces函数以及人脸数据类FaceInfo:
detectFaces函数:
参数
类型
说明
data
byte[]
图像数据的内存
width
int
图像的宽
height
int
图像的高
format
int
图像的格式
faceInfoList
List
人脸检测结果列表
FaceInfo定义:
参数
类型
说明
rect
Rect
人脸在图像中的坐标
orient
int
人脸的朝向
faceId
int
人脸id,用于标识人脸
人脸检测函数介绍的文章有很多,这里就不多做介绍了。FaceInfo中的rect就是我们用来抠取人脸的重要参数,下图就是根据它画出的人脸框。
2. 如何根据人脸框裁剪
以Android平台为例,Bitmap类提供了函数createBitmap(Bitmap source, int x, int y, int width, int height)
参数
类型
说明
source
Bitmap
原始图像
x
int
人脸框左上角y坐标
y
int
人脸框左上角y坐标
width
int
新图像的宽
height
int
新图像的高
使用这个函数就可以抠取任意区域内图像内容:
//原图 Bitmap source; //人脸框 Rect faceRect; //创建Bitmap Bitmap.createBitmap(source,faceRect.left,faceRect.top,faceRect.width(),faceRect.height();
2. 如何根据人脸框裁剪
以Android平台为例,Bitmap类提供了函数createBitmap(Bitmap source, int x, int y, int width, int height)
参数
类型
说明
source
Bitmap
原始图像
x
int
人脸框左上角y坐标
y
int
人脸框左上角y坐标
width
int
新图像的宽
height
int
新图像的高
使用这个函数就可以抠取任意区域内图像内容:
//原图 Bitmap source; //人脸框 Rect faceRect; //创建Bitmap Bitmap.createBitmap(source,faceRect.left,faceRect.top,faceRect.width(),faceRect.height();
3. 如何进行结果图旋转
FaceInfo中orient代表这个人脸在图像中的朝向,当其不为0°的时候,需要根据实际情况进行旋转。
旋转角度
类型
说明
ASF_OC_0
int
0°
ASF_OC_90
int
逆时针90°
ASF_OC_180
int
180°
ASF_OC_270
int
顺时针90°
以下是旋转代码
//原图 Bitmap source; //人脸框 Rect faceRect; //创建Bitmap,假设需要顺时针旋转90° Matrix matrix = new Matrix();
matrix.postRotate(90);
Bitmap.createBitmap(source, faceRect.left, faceRect.top, faceRect.width(),
faceRect.height(), matrix, true);
4. 应用场景举例
例如门禁场景下,需要显示人脸(抠图)或者上传人脸图片到服务端。如果上传完整的图像,则会占用大量的存储空间以及网络资源,所以上传抠取的人脸图片是比较合适的,但是根据检测所得的人脸框抠取的人脸是不完整的,所以需要对人脸框做一些后期处理,最简单的方案就是宽高分别向外扩大其1/2长度。示例代码如下:
//原图 Bitmap source; //人脸框 Rect faceRect; //调整人脸框 Rect newRect = new Rect(faceRect); //确保人脸框在图像内 if (newRect.left < 0) {
newRect.left = 0;
} if (newRect.top < 0) {
newRect.top = 0;
} if (newRect.right > source.getWidth()) {
newRect.right =
source.getWidth();
} if (newRect.bottom > source.getHeight()) {
newRect.bottom =
source.getHeight();
} // int offsetX = Math.min(Math.min(faceRect.width()/2,newRect.left),
source.getWidth() - newRect.right); int offsetY = Math.min(Math.min(faceRect.height()/2,newRect.top),
source.getHeight() - newRect.bottom);
newRect.inset(-offsetX, -offsetY); //创建Bitmap,假设需要顺时针旋转90° Matrix matrix = new Matrix();
matrix.postRotate(90);
Bitmap.createBitmap(source, newRect.left, newRect.top, newRect.width(),
newRect.height(), matrix, true);
温馨提示:
虹软人脸识别Android Demo中提供了很多人脸识别相关功能,如:画人脸框适配方案;异步人脸特征提取;异步人脸特征比对等等,有需要可以在下面链接下载:
Android Demo可在下载
android人脸抠图,人脸框抠图如何实现相关推荐
- Android自定义人脸识别框,android自定义虹软人脸识别框/人脸抓拍框/人脸追踪框...
有一两个月没有更新博客了,最近一直在忙人脸识别的项目,先将项目中更改虹软人脸框的方法抽取出来,希望对大家有所帮助. 尊重原创,转载请注明出处: http://blog..net/qq137722697 ...
- android opencv NDK人脸识别和对比
} env->ReleaseStringUTFChars(name, filePath); return 0; } 人脸对比 /** *人脸对比 */ extern "C" ...
- Android中的人脸检测入门
原文作者 : Paul Trebilcox-Ruiz 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转载权,未经允许,不得转载! 译者 : Langl ...
- 人脸识别 android p,虹软人脸识别 - faceId及IR活体检测的更新介绍
虹软人脸识别 - faceId及IR活体检测的介绍 前几天虹软推出了 Android ArcFace 2.2版本的SDK,相比于2.1版本,2.2版本中的变化如下: VIDEO模式新增faceId(类 ...
- Android开发简单人脸签到系统开发
需求分析 第一步我对该实验做了一个完整性的需求分析: 我们需要做到以下几点: (1)学生信息的管理,对学生的信息的添加,删除,编译修改: (2)基于每个学生的人脸上传,并识别该图片是否是一个人脸图片: ...
- android 静态图片自动切换,Android静态图片人脸识别的完整demo(附完整源码)
Android静态图片人脸识别的完整demo(附完整源码) 来源:互联网 作者:佚名 时间:2015-03-24 20:07 本文介绍了android静态识别人脸并进行标记人眼位置及人脸框的完整dem ...
- Android园区部队人脸识别源码门禁项目讲解
Android园区部队人脸识别源码门禁项目讲解 这边搞人脸识别相关项目有一段时间,今天抽时间讲述一个经典的人脸识别项目:部队人脸识别门禁系统. 大家都知道部队对人员管理安全要求是相当高的,很多保密的技 ...
- Android NDK开发——人脸检测与静默活体检测
前言 1.开发环境是win10,IDE是Android studio 北极狐,用到的库有NCNN,OpenCV. 2.NCNN库可以用官方编译好的releases库,也可以按官方文档自己编译. 3.O ...
- 基于Android系统的人脸识别签到软件
项目名称: 基于Android系统的人脸识别签到软件 目 录 1 项目介绍..... 1 1.1 项目背景.... 1 1.2 产品特点.... 2 1.3 可行性分析.... 2 1.3.1 ...
- CoLab - 图像人脸检测_框出人脸
CoLab - 图像人脸检测_框出人脸 此文章教你如何使用谷歌Colaboratory实现静止图片的人脸检测和划框框. CoLab最大好处:GPU计算速度快! 注: · 国内登陆Colab需使用到梯梯 ...
最新文章
- tomcat与iis公用80端口(已经发布.net项目现在开发Java项目时tomcat在eclipse中localhost:8080打不开问题)...
- 滚动条的出现导致居中的元素会晃动
- 预备作业02 20162316刘诚昊
- [九度][何海涛] 栈的压入压出
- 初识openstack
- Spark2.3.1在Idea控制台调整日志等级
- 操作符!与操作符!!的区别
- 用Barcode生成条形码图片
- Co-Fusion: Real-time Segmentation, Tracking and Fusion of Multiple Objects
- 浅谈语音识别技术的发展趋势与应用前景 - 全文
- php网站怎么看用户名,首页登录后怎么在首页显示用户名以及隐藏登录框?
- matlab循环取出矩阵的某一行并标示上A1 A2 A3
- 1.WebServices 简介
- Java 8 你需要掌握的新特性
- linux怎样重启命令,Linux重启命令介绍
- 反编译工具ILSpy下载
- 【QT】入门基础教程Qt5
- python打印日历_Python怎么打印日历?
- 各地大厂名单(一二线城市知名公司)
- ROS学习笔记-创建订阅cmd_vel话题节点