千家信息网

人脸框抠图如何实现

发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,最近在尝试做一个人脸识别项目,在对比几款主流人脸识别SDK后,采用了虹软的Arcface SDK,因为它提供了免费版本,并且可以离线使用,接入难度也比较低。项目中有一个需求就是显示检测到的人脸,但是如
千家信息网最后更新 2024年09月22日人脸框抠图如何实现

最近在尝试做一个人脸识别项目,在对比几款主流人脸识别SDK后,采用了虹软的Arcface SDK,因为它提供了免费版本,并且可以离线使用,接入难度也比较低。项目中有一个需求就是显示检测到的人脸,但是如何从一张图片中抠取合适大小的人脸呢?本文将从以下步骤来介绍如何实现:

1. 如何获得人脸框
2. 如何根据人脸框裁剪
3. 如何进行结果图旋转
4. 应用场景举例

1. 如何获得人脸框

首先我们来看一下虹软Android ArcFace SDK用于人脸检测的detectFaces函数以及人脸数据类FaceInfo:
detectFaces函数:

参数类型说明
databyte[]图像数据的内存
widthint图像的宽
heightint图像的高
formatint图像的格式
faceInfoListList人脸检测结果列表

FaceInfo定义:

参数类型说明
rectRect人脸在图像中的坐标
orientint人脸的朝向
faceIdint人脸id,用于标识人脸

人脸检测函数介绍的文章有很多,这里就不多做介绍了。FaceInfo中的rect就是我们用来抠取人脸的重要参数,下图就是根据它画出的人脸框。

2. 如何根据人脸框裁剪

以Android平台为例,Bitmap类提供了函数 createBitmap(Bitmap source, int x, int y, int width, int height)

参数类型说明
sourceBitmap原始图像
xint人脸框左上角y坐标
yint人脸框左上角y坐标
widthint新图像的宽
heightint新图像的高

使用这个函数就可以抠取任意区域内图像内容:

//原图Bitmap source;//人脸框Rect faceRect;//创建BitmapBitmap.createBitmap(source,faceRect.left,faceRect.top,faceRect.width(),faceRect.height();


3. 如何进行结果图旋转

FaceInfo中orient代表这个人脸在图像中的朝向,当其不为0°的时候,需要根据实际情况进行旋转。

旋转角度类型说明
ASF_OC_0int
ASF_OC_90int逆时针90°
ASF_OC_180int180°
ASF_OC_270int顺时针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可在 虹软人脸识别开放平台下载

人脸 图像 函数 检测 参数 就是 类型 原图 图片 场景 坐标 时针 结果 合适 代码 左上角 平台 数据 特征 项目 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 能管系统服务器怎么管理 苹果服务器安装第三方模块 成都理工大学计算机软件开发如何 现在大家常用的软件开发模型 乌鲁木齐软件开发需要多少钱 全球互联网时代和科技发展 数据库原理 自然连接 王牌战争怎么创造服务器教程 群晖服务器管理系统 高淳区一站式软件开发创新服务 如何杀掉oracle数据库进程 东营陶瓷库存软件开发公司 我的世界服务器怎么登陆 建免费的数据库 网络安全装置属于电子设备 日本网络安全宣传 软件开发的沟通属于哪个部门 青岛小牛网络技术有限公司 卧龙吟2服务器开放时间 掌控网络安全学院 网络安全事件零发生 镜像数据库mysql 电子资源数据库有哪些搜索方式 深圳市小狼标网络技术有限公司 针织机软件开发商 辽宁网络安全竞赛 青岛小牛网络技术有限公司 服务器是不是一定要用固定ip 九台软件开发有限公司 安徽省网络安全总队
0