Android应用开发提高篇(6)-----FaceDetector(人脸检测)
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/10/2388776.html
一、概述
初次看到FaceDetector这个类时,心里想:Android真的很强大。但直到我实际应用它的时候,心情从高山跌倒了谷底(看实现中的结果就知道了),再仔细看看官方文档,才知道这个类是API LEVEL1的,我就晕了,这就说明这个类很早就有了,但为什么到现在还没有得到改善呢。写这篇文章的目的还有一个,就是想强调一下用SurfaceView来画图的时候,要用某个事件来触发,而不能在程序一开始运行的时候就直接画图。好吧,下面看看这个类有多“强大”。
二、实现
新建工程MyFace,修改/res/layout/main.xml文件,在里面添加一个Button和一个SurfaceView,完整的main.xml如下:

1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="fill_parent"
4 android:layout_height="fill_parent"
5 android:orientation="vertical" >
6
7 <Button
8 android:id="@+id/button"
9 android:layout_width="fill_parent"
10 android:layout_height="wrap_content"
11 android:text="开始检测"
12 />
13 <SurfaceView
14 android:id="@+id/surfaceview"
15 android:layout_width="fill_parent"
16 android:layout_height="fill_parent"
17
18 />
19
20 </LinearLayout>

修改MyFaceActivity.java文件,实现按钮的监听,在按钮被点击后实现画图和人脸检测,详细说明看代码注释:

1 package com.nan.face;
2
3 import android.app.Activity;
4 import android.graphics.Bitmap;
5 import android.graphics.BitmapFactory;
6 import android.graphics.Canvas;
7 import android.graphics.Color;
8 import android.graphics.Paint;
9 import android.graphics.PointF;
10 import android.graphics.Rect;
11 import android.media.FaceDetector;
12 import android.os.Bundle;
13 import android.util.Log;
14 import android.view.SurfaceHolder;
15 import android.view.SurfaceView;
16 import android.view.View;
17 import android.widget.Button;
18
19 public class MyFaceActivity extends Activity
20 {
21 private Button mButton = null;
22 private SurfaceView mSurfaceView = null;
23 private SurfaceHolder mSurfaceHolder = null;
24
25 @Override
26 public void onCreate(Bundle savedInstanceState)
27 {
28 super.onCreate(savedInstanceState);
29 setContentView(R.layout.main);
30
31 mButton = (Button)findViewById(R.id.button);
32 mSurfaceView = (SurfaceView)findViewById(R.id.surfaceview);
33 mSurfaceHolder = mSurfaceView.getHolder();
34
35 //按钮监听
36 mButton.setOnClickListener(new View.OnClickListener()
37 {
38
39 public void onClick(View v)
40 {
41 // TODO Auto-generated method stub
42
43 BitmapFactory.Options bitmapOption = new BitmapFactory.Options();
44 //图片的参数(这个参数要有,不然找不到人脸)
45 bitmapOption.inPreferredConfig = Bitmap.Config.RGB_565;
46 Bitmap myBitmap;
47 //获取图片资源
48 myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.mm,bitmapOption);
49 //假设最多有5张脸
50 int numOfFaces = 5;
51 FaceDetector mFaceDetector = new FaceDetector(myBitmap.getWidth(),myBitmap.getHeight(),numOfFaces);
52 FaceDetector.Face[] mFace = new FaceDetector.Face[numOfFaces];
53 //获取实际上有多少张脸
54 numOfFaces = mFaceDetector.findFaces(myBitmap, mFace);
55 Log.v("------------->", ""+numOfFaces);
56
57 //锁定整个SurfaceView
58 Canvas mCanvas = mSurfaceHolder.lockCanvas();
59 //画图
60 mCanvas.drawBitmap(myBitmap, 0f, 0f, null);
61 //绘制完成,提交修改
62 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
63 //重新锁一次
64 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));
65 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
66
67 Paint mPaint = new Paint();
68 //画笔颜色
69 mPaint.setColor(Color.GREEN);
70 //画笔的样式是矩形框,不是矩形块
71 mPaint.setStyle(Paint.Style.STROKE);
72 //线宽
73 mPaint.setStrokeWidth(2.0f);
74
75 float eyesDistance = 0f;
76
77 //将所有检测到的脸框出来
78 for(int i=0;i < numOfFaces;i++)
79 {
80 PointF eyeMidPoint = new PointF();
81 //两眼的中点距离
82 mFace[i].getMidPoint(eyeMidPoint);
83 //两眼之间的距离
84 eyesDistance = mFace[i].eyesDistance();
85
86 //锁定整个SurfaceView
87 mCanvas = mSurfaceHolder.lockCanvas();
88 //画矩形框
89 mCanvas.drawRect((int)(eyeMidPoint.x-eyesDistance),
90 (int)(eyeMidPoint.y-eyesDistance),
91 (int)(eyeMidPoint.x+eyesDistance),
92 (int)(eyeMidPoint.y+eyesDistance),
93 mPaint);
94 //绘制完成,提交修改
95 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
96 //重新锁一次
97 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0));
98 mSurfaceHolder.unlockCanvasAndPost(mCanvas);
99
100 }
101
102 }
103 });
104 }
105
106 }

好,运行这个程序看看:
嗯,是检测出来了。等等,换一张有2张人脸的图片,再运行这个程序看看:
嗯,也检测出来了,不过只检测出来一个。
检测速度先不说了,不知道是我写的程序有问题,还是Android本身只能检测一个?希望是我的程序有问题。
PS:所用的图片是网上找的。
Android应用开发提高篇(6)-----FaceDetector(人脸检测)的更多相关文章
- Android应用开发提高篇(1)-----获取本地IP
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/21/2361802.html 一.概述 习惯了Linux下的网络编程,在还没用智能机之前就一直想 ...
- Android JNI开发提高篇
有关JNI的开发技术,我们继续围绕Android平台进行,JNI可以支持C或C++,从目前为止我们写过的JNI代码均为C实现的,即文件名为.C而C++的和这些有什么不同呢? Android平台上的JN ...
- Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/04/2379628.html 一.概述 关于Socket编程的基本方法在基础篇里已经讲过,今天把 ...
- Android应用开发提高篇(5)-----Camera使用
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/06/2382679.html 一.概述 Camera是手机的一个很重要的设备,可以说现在的每一部 ...
- Android应用开发提高篇(3)-----传感器(Sensor)编程
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/29/2373420.html 一.概述 Android支持的传感器种类越来越多了,这确实是一件可 ...
- Android应用开发提高篇(2)-----文本朗读TTS(TextToSpeech)
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/02/26/2368696.html 一.概述 TextToSpeech,就是将文本内容转换成语音,在其 ...
- Android应用开发基础篇(1)-----Button
Android应用开发基础篇(1)-----Button 一.概述 Button,顾名思义就是按钮的意思,它主要的功能是响应用户按下按钮时的动作. 二.应用 新建一个工程, ...
- android 串口开发第二篇:利用jni实现android和串口通信
一:串口通信简介 由于串口开发涉及到jni,所以开发环境需要支持ndk开发,如果未配置ndk配置的朋友,或者对jni不熟悉的朋友,请查看上一篇文章,android 串口开发第一篇:搭建ndk开发环境以 ...
- Android UI开发第四十一篇——墨迹天气3.0引导界面及动画实现
周末升级了墨迹天气,看着引导界面做的不错,模仿一下,可能与原作者的代码实现不一样,但是实现的效果还是差不多的.先分享一篇以前的文章,android动画的基础知识,<Android UI开发第十二 ...
随机推荐
- POJ 2686 Traveling by Stagecoach 壮压DP
大意是有一个人从某个城市要到另一个城市(点数<=30) 然后有n个马车票,相邻的两个城市走的话要消耗掉一个马车票. 花费的时间呢,是马车票上有个速率值,用边/速率就是花的时间. 问最后这个人花费 ...
- [Leetcode][Python]31: Next Permutation
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 31: Next Permutationhttps://oj.leetcode ...
- 练习一下linux中的list函数。
所有的list函数见 include/linux/list.h 自己从 include/linux/list.h 拷贝了一些函数到自己的list.c中, 然后练习了一下. 没有别的目的,就是想熟练一下 ...
- Objective-C内存管理教程和原理剖析(三)
初学Objective-C的朋友都有一个困惑,总觉得对Objective-C的内存管理机制琢磨不透,程 序经常内存泄漏或莫名其妙的崩溃.我在这里总结了自己对Objective-C内存管理机制的研究成果 ...
- 关于在App_Code文件夹自定义类中Session无法使用
由于前台页面需要调用App_Code中自定义类的函数,但在自定义类中找不到Session,解决方法如下: 新建一个类session,并自己定义函数GetSession(),引用命名空间 System. ...
- 【Java并发编程】并发编程大合集-值得收藏
http://blog.csdn.net/ns_code/article/details/17539599这个博主的关于java并发编程系列很不错,值得收藏. 为了方便各位网友学习以及方便自己复习之用 ...
- jsp建立错误页自动跳转
在各个常用的web站点中,经常会发现这样一个功能:当一个页面出错后,会自动跳转到一个页面上进行错误信息的提示. 想要完成错误页的操作,则一定要满足两个条件: 1.指定错误出现时的跳转页,通过error ...
- webpack和webpack-dev-server的区别
第一: webpack只是构建 webpack-dev-server除了构建,还提供web服务 第二:webpack.config.json的路径参数 显然,entry都一样,因为都要知道需要构建 ...
- C++_基础_继承、多态
内容: (1)子类中的拷贝构造和拷贝赋值 (2)多继承和虚继承 (3)多态的初识 (4)虚析构的特性和使用 (5)多态的底层实现 (6)纯虚函数.抽象类的概念 1.子类中的拷贝构造和拷贝赋值 子类中的 ...
- JS中小数的差,比较大小
var a = 0.3-0.2; -0.3; alert(a + "&" + b); if (a == b) { alert("true"); } el ...