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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql databasemetadata_DatabaseMetaData和ResultSetMetaData接口获取元数据的方法

    mysql databasemetadata_DatabaseMetaData和ResultSetMetaData接口获取元数据的方法DatabaseMeta 和 ResultSetMet 就是两个常用的获取数据库元数据相关信息的接口 本文讲解 DatabaseMeta 和 ResultSetMet 接口获取元数据的方法 packagewww wlkankan com importjava sql Connection importjava sql DatabaseMeta importja

    2025年8月31日
    5
  • linux快捷键大全_电脑常用的快捷键大全

    linux快捷键大全_电脑常用的快捷键大全Linux常用快捷键,基础菜鸟推荐~

    2022年4月20日
    48
  • Python list列表删除元素(4种方法)

    Python list列表删除元素(4种方法)Pythonlist 列表删除元素 4 种方法 在 Python 列表中删除元素主要分为以下 3 种场景 根据目标元素所在位置的索引进行删除 可以使用 del 关键字或者 pop 方法 根据元素本身的值进行删除 可使用列表 list 类型 提供的 remove 方法 将列表中所有元素全部删除 可使用列表 list 类型 提供的 clear 方法 del 根据索引值删除元素 del 是 Python 中的关键字 专门用来执行删除操作 它不仅可以删除整个列表 还可以删除列表中的某些元素 我们已经

    2025年7月8日
    3
  • 手把手教你学DSP5509视频教程「建议收藏」

    手把手教你学DSP5509视频教程「建议收藏」链接:https://pan.baidu.com/s/1GwRgSKOm_4wKkNUS65iJrA提取码:ybdy

    2022年5月5日
    50
  • Sublime Text 3 注册/激活方法

    Sublime Text 3 注册/激活方法Sublime是一款很好用的编辑器,虽然是免费使用,但是经常会弹出吆喝着让你购买(purchase)的弹窗,对一名优秀的强迫症来说看久了还是很烦人的。而且现在网上很多注册码都不可用。那么要怎么解决呢?下面提供两种解决方案。(我是在win10系统上操作的)二、方案方案一[1]1)建立一个bat文件(随便取个名字,如“runHost.bat”),复制以下代码到…

    2022年7月27日
    9
  • 台式机通过网线连接笔记本的wifi网络

    台式机通过网线连接笔记本的wifi网络由于在实验室的场地要求,不容易拉网线进行学习,也就开始研究利用网线连接笔记本来使台式机连接上网络。【台式机:Ubuntu18.04+笔记本:Windows10】首先,Ubuntu系统的网络设置不变【IPV4,IPV6都是自动的】其次开始设置Windows10的网络(设置不好容易导致笔记本也上不了网哦)1.右击我们的图标,进入网络和Internet设置。2.进入网络和共享中心3.点击笔记本的WLAN网络(这个时候默认你已经插上了网线,而且进入的这个过程可以通过控制面板进入)4.这个时候

    2022年6月26日
    40

发表回复

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

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