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类中,该类无法再扩展。从该类能够获取到人眼的中心位置和双眼之间的详细。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • matlab如何使用循环语句_matlab中循环语句怎么写

    matlab如何使用循环语句_matlab中循环语句怎么写对于fo循环和while循环均适用:1)for语句中赋值问题%理解for循环clccleara=1;m=3;fori=1:m%理解此处的m不是向量,是循环时的某一个固定值b(i)=a*i%得到的b值保留前一个循环中计算的值。是一个随着i变化的向量,loop1时向量中有1个元素;loop2时有2个元素,分别是loop1中值和loop2中

  • IntelliJ IDEA 配置svn及使用

    IntelliJ IDEA 配置svn及使用1.安装svn客户端之前用myEcplise只需要插件,现在IDEA需要先下载客户端:TortoiseSVN(小乌龟),下载后安装,然后记住安装路径,我安装的是64位的。TortoiseSVN的下载地址:https://tortoisesvn.net/downloads.html下载完成之后然后开始运行安装svn在勾选之前记得要安装改路径,例:F:\svnClient…

  • zencart免费模板下载

    zencart免费模板下载最近工作比较忙,没有时间专门来制作这个免费的包包模板。趁国庆放假有时间,顺便就把这个免费模板制作完了。今天特别提供出来给大家下载使用。考虑到很难满足所有有的要求,所以这个模板在一些地方基本没有修改原有模板的布局,只是简单的修改CSS。不过经过修改的这个模板也还算漂亮,大体上的布局已经设置好。我们没有那么多的时间去美化一个这样的模板,俗话说:授人鱼不如授人渔。如果有兴趣做二次开发的朋友可以继续修

  • 蓝桥杯真题汇总[通俗易懂]

    第九届A组:1.分数2.星期一​​​​​​3.乘积尾零4.第几个幸运数5.打印图形6.航班时间8.全球变暖9.倍数问题10.​​​​​​​付账问题

  • leetcode 回文数_字符串反转java

    leetcode 回文数_字符串反转java原题链接请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数 myAtoi(string s) 的算法如下:读入字符串并丢弃无用的前导空格检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。将前面步骤读入的这些数字转换为整数(即,“1

  • js字符串转html_vue文件如何编译成html

    js字符串转html_vue文件如何编译成htmlhtml代码如何转换成js文件这个很简单首先你要把html代码转成js代码有这种转换工具的搜下代码转换工具就可以再把你转换好了的代码放到文本中把后缀名改成点js就可以了可以用txt文档改js文件用记事本可以打开小编喝醉了酒,流入街头可怜的像条狗,哭着对你说别走,你义无反顾笑笑也不回头。把HTML代码放到document.write方法的括号中,并用引号括起来,将原来HTML中的引号进…

发表回复

您的电子邮箱地址不会被公开。

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