微软的 how-old.net 把人脸识别技术又大大的火了一把。通过大数据和复杂的算法,能够神奇的预测出照片中人物的性别和年龄。虽然错误率也不低,但是大家都抱着玩一玩乐一乐的心态把照片传上去让机器来鉴定一下自己的颜龄。

Android 早已提供了 FaceDetector 类,今天就来看看如何使用这个类人脸检测吧。

流程:

1.打开文件夹选择照片

2.将照片加载到 bitmap 中并缩放到设置的宽高

3.用 FaceDetector 来检测人脸,得到 Face 类数组(多人脸检测)

4.在照片 bitmap 检测到的人脸上面画上方框和年龄

一、选择照片

将 Intent 设置 Type 和 Action,启动 activity 选择照片并得到照片的 uri。

        Intent intent = new Intent();intent.setType("image/*");intent.setAction(Intent.ACTION_GET_CONTENT);startActivityForResult(intent, OPEN_PHOTO_FOLDER_REQUEST_CODE);

二、加载照片到 bitmap 并缩放

新建一个类 FDView 继承自 View,就像上一篇文章一样,对 bitmap 的修改用到了 canvas 的知识。

有两种办法将照片加载到 bitmap 中:

1.通过 uri 用 stream 的方式

public void initBitmap(Uri uri,int width,int height) {try {ContentResolver resolver = mContext.getContentResolver();BitmapFactory.Options options = new BitmapFactory.Options();options.inPreferredConfig = Bitmap.Config.RGB_565;//need this configBitmap bitmap = BitmapFactory.decodeStream(resolver.openInputStream(uri), null, options);mBitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height);//scale the bitmapdetectFace();} catch (Exception ex) {Log.e(TAG,"exception: "+ex.getMessage());}}

2.用照片的真实路径加载

获得真实路径:

private void initFRViewWithPath(Uri uri) {String[] projection =   {MediaStore.Images.Media.DATA};//        Cursor cursor = managedQuery(uri, projection, null, null, null);//deprecatedCursorLoader cursorLoader = new CursorLoader(this,uri,projection,null,null,null);Cursor cursor = cursorLoader.loadInBackground();int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);cursor.moveToFirst();String path = cursor.getString(column_index);Log.e(TAG,"real path: "+path);mFRView.initBitmap(path,mFRView.getWidth (),mFRView.getHeight());}

decodeFile:

public void initBitmap(String path,int width,int height) {BitmapFactory.Options options = new BitmapFactory.Options();options.inPreferredConfig = Bitmap.Config.RGB_565;mBitmap = BitmapFactory.decodeFile(path, options);mBitmap = ThumbnailUtils.extractThumbnail(mBitmap,width,height);//scale the bitmapdetectFace();}

三、人脸检测

private void detectFace() {if(mBitmap != null) {mImageWidth = mBitmap.getWidth();mImageHeight = mBitmap.getHeight();mFaces = new FaceDetector.Face[NUMBER_OF_FACES];mFaceDetector = new FaceDetector(mImageWidth, mImageHeight, NUMBER_OF_FACES);mNumberOfFaceDetected = mFaceDetector.findFaces(mBitmap, mFaces);invalidate();}}

四、人脸上画框

在 onDraw 中用 canvas 将检测到的人脸画上框并写上年龄。

@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);if(mBitmap != null) {canvas.drawBitmap(mBitmap, 0, 0, null);Paint paint = new Paint();paint.setColor(Color.WHITE);paint.setStyle(Paint.Style.STROKE);paint.setStrokeWidth(2);paint.setTextSize(50);for(int i=0; i < mNumberOfFaceDetected; i++){FaceDetector.Face face = mFaces[i];PointF pointF = new PointF();face.getMidPoint(pointF);mEyesDistance = face.eyesDistance();canvas.drawRect((int)(pointF.x - mEyesDistance),(int)(pointF.y - mEyesDistance/2),(int)(pointF.x + mEyesDistance),(int)(pointF.y + mEyesDistance*3/2),paint);canvas.drawText("28",pointF.x,pointF.y - mEyesDistance/2-5,paint);}}}

最终效果图:

FaceDetector(人脸识别)相关推荐

  1. android人脸识别源代码,Android自带的人脸识别

    1.Android自带的人脸识别Android自带的人脸识别只能识别出人脸在画面中的位置,中点,眼间距,角度等基本特性,提供给拍照性质的应用使用.从基本功能中不能得出明显的特征数据 2.底层库支持ex ...

  2. Android自带的人脸识别

    1.     Android自带的人脸识别 Android自带的人脸识别只能识别出人脸在画面中的位置,中点,眼间距,角度等基本特性,提供给拍照性质的应用使用.从基本功能中不能得出明显的特征数据 2.  ...

  3. android 动态人脸识别码,Android开发中人脸识别(静态)

    知道没有妹纸,你们是不会看的.先放效果图 最近,项目中需要用到人脸识别,苦于无奈,各种百度,google有关Android开发中人脸识别的内容,最终发现Android官方自带的FaceDetector ...

  4. iOS之使用CoreImage进行人脸识别

    更新 :应各位朋友的需求,补上了OC版本的demo, OC版下载地址 另外附上 : swift版下载地址 CoreImage是Cocoa Touch中一个强大的API,也是iOS SDK中的关键部分, ...

  5. java opencv4.40图片实现人脸识别(2)

    在之前博客中我们介绍了opencv4.4的安装: https://blog.csdn.net/datouniao1/article/details/108072623 我们利用opencv4.4中提供 ...

  6. c# image转换为bitmap_C# 人脸识别库

    (给DotNet加星标,提升.Net技能) 转自:View12138cnblogs.com/view12138/p/ViewFaceCore.html .NET人脸识别库ViewFaceCore 这是 ...

  7. Android FeceDetector(人脸识别)

    1. FectDetector 人脸的检测方法是用双眼来检测人脸的位置,也就是说无法检测到嘴.侧脸等,双眼必须同时可见,并且眼镜会影响检测的效果.实际上,FaceDetector检测到的并不是人的全脸 ...

  8. 19_Android中图片处理原理篇,关于人脸识别网站,图片加载到内存,图片缩放,图片翻转倒置,网上撕衣服游戏案例编写...

    1 加载图片到内存 (1).数码相机照片特别是大于3m以上的,内存吃不消,会报OutOfMemoryError,若是想只显示原图片的1/8,可以通过BitmapFactory.Options来实现,具 ...

  9. 基于 OpenCV 的人脸识别

    一点背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...

最新文章

  1. 分享9个提高代码运行效率的小技巧
  2. 问题解决:树莓派上Python用pip进行安装耗尽内存,卡死
  3. ListView单选的实现总结(转)
  4. uCOS-II任务建立示例
  5. mysql中如何删除多个表格_mysql怎么批量删除多个表?
  6. Android实例-拍摄和分享照片、分享文本(XE8+小米2)
  7. 12v小型电机型号大全_鄂破碎机型号大全图,小型鄂破碎机价格
  8. 状态机设计的一般步骤_浅谈状态机
  9. 关于分辨率和地图打印的一些问题
  10. lucene5 排序
  11. Element-UI学习笔记-安装
  12. xrd连续扫描和步进扫描_多晶XRD步进扫描与连续扫描介绍
  13. 社交电商-京东云小店简介
  14. Jshop小程序商城
  15. 电子元器件企业面临缺货涨价,SRM协同系统助力企业采购数字化智慧升级
  16. Pr 如何模拟水下音效
  17. 微信上网卡WeSim悄然发布
  18. pdps安装oracle12安装,Tecnomatix PDPS安装教程适用于Oracle版本11g
  19. 【模型部署】NNI:剪枝和量化
  20. ROOK-01 集群简单搭建和卸载

热门文章

  1. [ 转载 ] Java基础10--关于Object类下所有方法的简单解析
  2. Visual studio C++ MFC之列表控件CListCtrl Control
  3. bat产品经理能力模型_浅析产品经理能力模型
  4. uni app 调用网络打印机_uni-app封装一个request请求
  5. 虚拟机安装日志服务器,rsyslog日志服务器搭建
  6. python 模拟浏览器selenium_使用python selenium webdriver模拟浏览器
  7. 游戏英雄联盟高清壁纸,人物角色都包括
  8. 适合传统节日促销首焦设计的PSD分层模板
  9. 多品类电商促销海报PSD分层模板,宠溺好物
  10. 淘宝电商页面和产品海报设计PSD分层素材模板