Android多媒体-人脸识别

Android多媒体-人脸识别

1. 相关背景

Google 于2006年8月收购Neven Vision 公司 (该公司拥有 10 多项应用于移动设备领域的图像识别的专利),以此获得了图像识别的技术,并不是常快应用到免费的 Picasa 相冊管理程序中,提供基于人脸识别的相片管理功能,另外还推出了一个新项目叫Goggle ,能从照片中识别世界各地的地标建筑,相同Google 也把人脸识别功能加入�到了Android 中。只是因为个人隐私等相关因素,Google Goggles好像临时屏蔽了人脸识别功能 。

2. Android 中的人脸识别技术

底层库:android/external/neven/

framework 层:frameworks/base/media/java/android/media/FaceDetector.java

Java 层接口的限制:

仅仅能接受 Bitmap 格式的数据

仅仅能识别双眼距离大于 20 像素的人脸像(当然,这个可在framework层中改动)

仅仅能检測出人脸的位置(双眼的中心点及距离)

不能对人脸进行匹配(查找指定的脸谱)

3. 人脸识别技术的应用

A. 为 Camera 加入�人脸识别的功能:使得 Camera 的取景器上能标识出人脸范围;假设硬件支持,能够对人脸进行对焦。

4. 静态图片处理代码实例:

package com.example.mydetect2;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.PointF; 
import android.media.FaceDetector; 	//人脸识别的关键类
import android.media.FaceDetector.Face; 
import android.view.View; 

public class MainActivity2 extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//setContentView(R.layout.activity_main_activity2);
		setContentView(new myView(this));	//使用自建的view来显示
		Log.i("zhangcheng","MainActivity2 run here");
	}

	private class myView extends View{
		private int imageWidth, imageHeight;
		private int numberOfFace = 5;		//最大检測的人脸数
		private FaceDetector myFaceDetect;	//人脸识别类的实例
		private FaceDetector.Face[] myFace;	//存储多张人脸的数组变量
		float myEyesDistance; 			//两眼之间的距离
		int numberOfFaceDetected; 		//实际检測到的人脸数
		Bitmap myBitmap;

		public myView(Context context){		//view类的构造函数,必须有
			super(context); 
			BitmapFactory.Options BitmapFactoryOptionsbfo = new BitmapFactory.Options(); 
			BitmapFactoryOptionsbfo.inPreferredConfig = Bitmap.Config.RGB_565;	//构造位图生成的參数,必须为565。类名+enum
			myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.baby, BitmapFactoryOptionsbfo);	 
			imageWidth = myBitmap.getWidth(); 
			imageHeight = myBitmap.getHeight(); 
			myFace = new FaceDetector.Face[numberOfFace]; 		//分配人脸数组空间
			myFaceDetect = new FaceDetector(imageWidth, imageHeight, numberOfFace); 
			numberOfFaceDetected = myFaceDetect.findFaces(myBitmap, myFace); 	//FaceDetector 构造实例并解析人脸
			Log.i("zhangcheng","numberOfFaceDetected is " + numberOfFaceDetected);
		}
		
		protected void onDraw(Canvas canvas){			//override函数,必有
			canvas.drawBitmap(myBitmap, 0, 0, null);	//画出位图 
			Paint myPaint = new Paint(); 
			myPaint.setColor(Color.GREEN); 
			myPaint.setStyle(Paint.Style.STROKE); 
			myPaint.setStrokeWidth(3); 			//设置位图上paint操作的參数

			for(int i=0; i < numberOfFaceDetected; i++){
				Face face = myFace[i];
				PointF myMidPoint = new PointF(); 
				face.getMidPoint(myMidPoint); 
				myEyesDistance = face.eyesDistance(); 	//得到人脸中心点和眼间距离參数,并对每一个人脸进行画框
				canvas.drawRect( 			//矩形框的位置參数
                        (int)(myMidPoint.x - myEyesDistance), 
                        (int)(myMidPoint.y - myEyesDistance), 
                        (int)(myMidPoint.x + myEyesDistance), 
                        (int)(myMidPoint.y + myEyesDistance), 
                        myPaint);
			}
		}
	}
}

效果例如以下:

<span>Android多媒体-人脸识别</span>

如要注意的地方:

依据文档描写叙述,输入图片必须为Bitmap RGB565格式。
人脸的检測方法是用双眼来检測人脸的位置,也就是说无法检測到嘴、側脸等,双眼必须同一时候可见,而且眼镜会影响检測的效果。
实际上,FaceDetector检測到的并非人的全脸,而仅仅是双眼。
实际測试中,发现图片太小的话检測不到人脸,试验中使用小于100×100的图片检測不到人脸,可是因为Android内存有限,图片太大的话,会出现无法载入图片的异常。
检測到的人脸存放到FaceDetector.Face类中,该类无法再扩展。从该类能够获取到人眼的中心位置和双眼之间的详细。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119048.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • centos7安装yum[通俗易懂]

    centos7安装yum[通俗易懂]centos7系统yum卸载后重新安装1.rpm包准备yum卸载后软件安装很麻烦,重新安装yum,先把相关rpm包下载下来,传到服务器。下载地址:http://mirrors.163.com/centos/7/os/x86_64/Packages/(我的是centos764位,所以是这个路径,看网址就可以知道每个路径是干嘛的,下载自己版本所需的即可,各个包小版本有变化,注意进行选择)…

    2022年6月4日
    45
  • js 截取字符串的三种方法「建议收藏」

    js 截取字符串的三种方法「建议收藏」方法1:substring()方法string.substring(from,to)方法从from位置截取到to位置,to可选,没有设置时默认到末尾。&lt;!DOCTYPEhtml&gt;&lt;html&gt;&lt;body&gt;&lt;script&gt;varstr="www.runoob.com!";document.write(str.subst…

    2022年5月13日
    38
  • executeupdate mysql_sql语句executeQuery和executeUpdate之间的区别

    executeupdate mysql_sql语句executeQuery和executeUpdate之间的区别方法一.executeQuery用于产生单个结果集(ResultSet)的语句,例如SELECT语句。被使用最多的执行SQL语句的方法。这个方法被用来执行SELECT语句,它几乎是使用最多的SQL语句。但也只能执行查询语句,执行后返回代表查询结果的ResultSet对象。如://加载数据库驱动Class.forName(“com.mysql.jdbc.Driver”);//使用D…

    2022年10月20日
    2
  • idea2022 license server激活【2021最新】

    (idea2022 license server激活)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月30日
    1.9K
  • Google Play支付 接入配置「建议收藏」

    Google Play支付 接入配置

    2022年2月13日
    144
  • 微信小程序开发 – 用户授权登陆「建议收藏」

    微信小程序开发 – 用户授权登陆「建议收藏」本篇将帮助读者实现基于微信开发者工具&amp;C#环境下的用户在小程序上的授权登陆。准备:微信开发者工具下载地址:https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html微信小程序开发文档:https://developers.weixin.qq.com/miniprogram/d…

    2022年6月12日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号