通过两个主要的API,Android提供了一个直接在位图上进行脸部检测的方法,这两个API分别是    android.media.FaceDetector和android.media.FaceDetector.Face,已经包含在Android官方API中。本教程来自Developer网站,向大家介绍了这些API,同时提供教程中实例代码下载。

所谓人脸检测就是指从一副图片或者一帧视频中标定出所有人脸的位置和尺寸。人脸检测是人脸识别系统中的一个重要环节,也可以独立应用于视频监控。在数字媒体日益普及的今天,利用人脸检测技术还可以帮助我们从海量图片数据中快速筛选出包含人脸的图片。 在目前的数码相机中,人脸检测可以用来完成自动对焦,即“脸部对焦”。“脸部对焦”是在自动曝光和自动对焦发明后,二十年来最重要的一次摄影技术革新。家用数码相机,占绝大多数的照片是以人为拍摄主体的,这就要求相机的自动曝光和对焦以人物为基准。

构建一个人脸检测的Android Activity

你可以构建一个通用的Android Activity,我们扩展了基类ImageView,成为MyImageView,而我们需要进行检测的包含人脸的位图文件必须是565格式,API才能正常工作。被检测出来的人脸需要一个置信测度(confidence measure),这个措施定义在android.media.FaceDetector.Face.CONFIDENCE_THRESHOLD。

最重要的方法实现在setFace(),它将FaceDetector对象实例化,同时调用findFaces,结果存放在faces里,人脸的中点转移到MyImageView。代码如下:publicclassTutorialOnFaceDetect1extendsActivity {

privateMyImageView mIV;

privateBitmap mFaceBitmap;

privateintmFaceWidth =200;

privateintmFaceHeight =200;

privatestaticfinalintMAX_FACES =1;

privatestaticString TAG ="TutorialOnFaceDetect";

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mIV = newMyImageView(this);

setContentView(mIV, newLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

// load the photo

Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.face3);

mFaceBitmap = b.copy(Bitmap.Config.RGB_565, true);

b.recycle();

mFaceWidth = mFaceBitmap.getWidth();

mFaceHeight = mFaceBitmap.getHeight();

mIV.setImageBitmap(mFaceBitmap);

// perform face detection and set the feature points setFace();

mIV.invalidate();

}

publicvoidsetFace() {

FaceDetector fd;

FaceDetector.Face [] faces = newFaceDetector.Face[MAX_FACES];

PointF midpoint = newPointF();

int[] fpx =null;

int[] fpy =null;

intcount =0;

try{

fd = newFaceDetector(mFaceWidth, mFaceHeight, MAX_FACES);

count = fd.findFaces(mFaceBitmap, faces);

} catch(Exception e) {

Log.e(TAG, "setFace(): "+ e.toString());

return;

}

// check if we detect any faces

if(count >0) {

fpx = newint[count];

fpy = newint[count];

for(inti =0; i

try{

faces[i].getMidPoint(midpoint);

fpx[i] = (int)midpoint.x;

fpy[i] = (int)midpoint.y;

} catch(Exception e) {

Log.e(TAG, "setFace(): face "+ i +": "+ e.toString());

}

}

}

mIV.setDisplayPoints(fpx, fpy, count, 0);

}

}

接下来的代码中,我们在MyImageView中添加setDisplayPoints() ,用来在被检测出的人脸上标记渲染。图1展示了一个标记在被检测处的人脸上处于中心位置。// set up detected face features for display

publicvoidsetDisplayPoints(int[] xx,int[] yy,inttotal,intstyle) {

mDisplayStyle = style;

mPX = null;

mPY = null;

if(xx !=null&& yy !=null&& total >0) {

mPX = newint[total];

mPY = newint[total];

for(inti =0; i

mPX[i] = xx[i];

mPY[i] = yy[i];

}

}

}

图1:单一人脸检测

多人脸检测

通过FaceDetector可以设定检测到人脸数目的上限。比如设置最多只检测10张脸:privatestaticfinalintMAX_FACES =10;

图2展示检测到多张人脸的情况。

图2:多人人脸检测

定位眼睛中心位置

Android人脸检测返回其他有用的信息,例同时会返回如eyesDistance,pose,以及confidence。我们可以通过eyesDistance来定位眼睛的中心位置。

下面的代码中,我们将setFace()放在doLengthyCalc()中。同时图3展示了定位眼睛中心位置的效果。publicclassTutorialOnFaceDetectextendsActivity {

privateMyImageView mIV;

privateBitmap mFaceBitmap;

privateintmFaceWidth =200;

privateintmFaceHeight =200;

privatestaticfinalintMAX_FACES =10;

privatestaticString TAG ="TutorialOnFaceDetect";

privatestaticbooleanDEBUG =false;

protectedstaticfinalintGUIUPDATE_SETFACE =999;

protectedHandler mHandler =newHandler(){

// @Override

publicvoidhandleMessage(Message msg) {

mIV.invalidate();

super.handleMessage(msg);

}

};

@Override

publicvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

mIV = newMyImageView(this);

setContentView(mIV, newLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

// load the photo

Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.face3);

mFaceBitmap = b.copy(Bitmap.Config.RGB_565, true);

b.recycle();

mFaceWidth = mFaceBitmap.getWidth();

mFaceHeight = mFaceBitmap.getHeight();

mIV.setImageBitmap(mFaceBitmap);

mIV.invalidate();

// perform face detection in setFace() in a background thread

doLengthyCalc();

}

publicvoidsetFace() {

FaceDetector fd;

FaceDetector.Face [] faces = newFaceDetector.Face[MAX_FACES];

PointF eyescenter = newPointF();

floateyesdist =0.0f;

int[] fpx =null;

int[] fpy =null;

intcount =0;

try{

fd = newFaceDetector(mFaceWidth, mFaceHeight, MAX_FACES);

count = fd.findFaces(mFaceBitmap, faces);

} catch(Exception e) {

Log.e(TAG, "setFace(): "+ e.toString());

return;

}

// check if we detect any faces

if(count >0) {

fpx = newint[count *2];

fpy = newint[count *2];

for(inti =0; i

try{

faces[i].getMidPoint(eyescenter);

eyesdist = faces[i].eyesDistance();

// set up left eye location

fpx[2* i] = (int)(eyescenter.x - eyesdist /2);

fpy[2* i] = (int)eyescenter.y;

// set up right eye location

fpx[2* i +1] = (int)(eyescenter.x + eyesdist /2);

fpy[2* i +1] = (int)eyescenter.y;

if(DEBUG) {

Log.e(TAG, "setFace(): face "+ i +": confidence = "+ faces[i].confidence()

+ ", eyes distance = "+ faces[i].eyesDistance()

+ ", pose = ("+ faces[i].pose(FaceDetector.Face.EULER_X) +","

+ faces[i].pose(FaceDetector.Face.EULER_Y) + ","

+ faces[i].pose(FaceDetector.Face.EULER_Z) + ")"

+ ", eyes midpoint = ("+ eyescenter.x +","+ eyescenter.y +")");

}

} catch(Exception e) {

Log.e(TAG, "setFace(): face "+ i +": "+ e.toString());

}

}

}

mIV.setDisplayPoints(fpx, fpy, count * 2,1);

}

privatevoiddoLengthyCalc() {

Thread t = newThread() {

Message m = newMessage();

publicvoidrun() {

try{

setFace();

m.what = TutorialOnFaceDetect.GUIUPDATE_SETFACE;

TutorialOnFaceDetect.this.mHandler.sendMessage(m);

} catch(Exception e) {

Log.e(TAG, "doLengthyCalc(): "+ e.toString());

}

}

};

t.start();

}

}

图3:定位眼睛中心位置

android 人脸检测 对焦,Android API教程:人脸检测(上)相关推荐

  1. android自动对焦第一次对焦,Android自定义相机实现自动对焦和手动对焦

    Android自定义相机实现自动对焦和手动对焦: 不调用系统相机,因为不同的机器打开相机呈现的界面不统一也不能满足需求. 所以为了让程序在不同的机器上呈现出统一的界面,并且可以根据需求进行布局,做了此 ...

  2. android触屏对焦,Android相机对焦模式

    I am trying to make a custom camera application I want to let the users can choose the focus mode in ...

  3. 人脸识别资源推荐:20款人脸检测/识别的API、库和软件

    人脸识别资源推荐:20款人脸检测/识别的API.库和软件 码上一课导读 人脸识别技术是一种依据人的面部特征,自动进行身份鉴别的一种技术,它综合运用了数字图像.视频处理.模式识别等多种技术.通过人脸特征 ...

  4. 第48讲 Android Camera2 API FD人脸检测

    本讲是Android Camera专题系列的第48讲,我们介绍Android Camera2 API专题的FD人脸检测,包括如下内容: FD Metadata FD模式 FD Results FD 实 ...

  5. 【Android App】利用自带的人脸检测器和OpenCV检测人脸讲解及实战(附源码和演示 超详细)

    需要源码请点赞关注收藏后评论区留言私信~~~~ 一.利用人脸检测器识别人脸 对于简单的人脸识别操作,Android已经提供了专门的识别工具,名叫人脸检测器FaceDetector,部分常用方法如下 F ...

  6. Android的虹软人脸识别和活体检测(附含10000个人脸图片和特征zip下载)

    文章目录 1.获取app_id和sdk_key和下载SDK的步骤 2.填写app_id和sdk_key 4.翻译 5.人脸识别错误码 6.人脸识别界面 7.重要的理解 8.自定义 9.查看手机文件里的 ...

  7. 人脸检测+人体检测C++ Android项目

    人脸检测+人体检测C++ Android项目 目录 人脸检测+人体检测C++ Android项目 1.项目说明 (1)训练 (2)端上部署 (3)依赖库 2. 人脸人体检测Demo 3. Androi ...

  8. android虹软人脸识别简书,基于虹软人脸识别API和Qt5的人脸识别

    测试和使用了虹软的人脸API在QT5环境下设计了一个简单的人脸识别软件,实现了对人脸的跟踪和人脸识别.摄像头的控制以及图像格式的转换使用了Opencv,图像显示使用的是QT5的Qimage控件.下面是 ...

  9. camera(17)---设置摄像头方向、打开线程与预览线程、设置参数、Camera外设按键、自动对焦与触摸对焦、拍照、人脸检测、位置管理、旋转管理、变焦、录像

    [Android]设置摄像头方向.打开线程与预览线程.设置参数.Camera外设按键.自动对焦与触摸对焦.拍照.人脸检测.位置管理.旋转管理.变焦.录像 阅读数:1673 设置摄像头方向.打开线程与预 ...

最新文章

  1. 广外计算机考研专业课,【广外考研论坛】 21广外各专业考研问题全解答!纯干货!...
  2. C#环境下的钩子详解
  3. SCOPE_IDENTITY和@@identity的区别
  4. hdu 4324 Triangle LOVE
  5. MATLAB的GUI中给坐标轴四周加上边框
  6. 用python七巧板模型拼图形_用七巧板拼图形
  7. Vue图片上传删除预览操作
  8. 小米路由R1D固件升级后导致Misstar tools插件页面显示错误解决方法
  9. 2.3、IPMP,PMP,PRINCE2
  10. 通过easyexcel将文本文件转为excel xlsx文件
  11. 苹果亮度自动调节怎么关闭_找不到“自动亮度调节”?这两个技巧帮你快速更改设置...
  12. 【C++】给定两个没有刻度的容器,对于任意给定的容积,求出如何只用两个瓶装出L升的水
  13. 思科cisoc 路由器IKEv2使用map配置隧道
  14. hash函数的简单介绍
  15. 雷电模拟器如何启动某一特定应用 | ldconsole.exe runapp打开雷电内的APP没有任何反应怎么办
  16. 阿里巴巴大数据学院落地成都,计划5年培养2000名高端专业人才
  17. 打破应试教育的思想才是重生之路
  18. P2P DHT sp
  19. 360手机安全专家给出了八大安全防范建议
  20. 阿里服务器教程大全-服务器、建站、备案、网站配置

热门文章

  1. Python dict_values取第一个值
  2. 蔡徐坤打篮球and源码
  3. discuz!x 应用中心更新为新地址解决方案之一
  4. 用于反激和准谐振的同步整流器MST1692DS
  5. MSP430F5529库函数——模数转换模块(ADC12)软件触发
  6. 计算机上1e153代表什么意思,手机网络信号G、E、3G、1X、H、4G及LTE各代表什么意思?...
  7. 办公自动化:输入关键字,查找Excel里的内容_xing2516_新浪博客
  8. 在html里如何下雪花,html加动态雪花
  9. NRFL2401学习
  10. CSDN获取积分规则