微软的 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. Ubuntu 想要更新源 报错 “E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用)”
  2. 【直播课】6小时教你熟知Anchor free理论基础,掌握项目实战技巧
  3. 腾讯云CentOS 7 上安装Nginx
  4. 二叉树面试题:判断树是否为完全二叉树和求二叉树的镜像
  5. 2017年AR大会上海站干货分享
  6. finally不管有没有错都会运行 finally 块用于清除 try 块中分配的任何资源,以及运行任何即使在发生异常时也必须执行的代码...
  7. 电影:换肤(Replace)
  8. 3D点云处理:直通滤波器高斯滤波器
  9. 【Android】_MediaServer_仿网易云音乐播放器1(指针和唱片)
  10. 使用Hash表时,针对Hash冲突的几个常见解决办法
  11. keras画神经网络拓扑结构图
  12. k-anonimity、l-diversity 和 t-closeness
  13. php 获取手机信息
  14. 网页游戏外挂资料(转)
  15. tesserocr的安装
  16. 计算机配色软件开发,电脑配色软件各个行业的应用
  17. Sonatype Nexus Maven仓库搭建和管理
  18. 安装虚拟机 vmware
  19. 公司要我做报表,只会随机数据图表的我感到危机感,来试试Python读取csv
  20. 【情态动词练习题】Can / Could you

热门文章

  1. [Bootstrap]bootstrap的简单原理
  2. js设置百分比保留两位小数
  3. Oracle总结第一篇【基本SQL操作】
  4. webstorm 破解方式
  5. 嵌入式Linux要学哪些东西?你真的造吗?
  6. winfrom中DataGridView使用笔记
  7. android+动画悬浮窗口,悬浮窗能实现自定Animation动画效果吗?
  8. python程序开机自启动_Linux下Python脚本自启动和定时启动的详细步骤
  9. 三维图形 纵坐标_《从柯氏四级培训效果评估到三维培训课程需求评估》
  10. 网站界面设计没有灵感,不妨去探索广袤的大自然!