Android应用开发FaceDetector(人脸检测)

2023-05-16

一、概述

      初次看到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:所用的图片是网上找的。



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android应用开发FaceDetector(人脸检测) 的相关文章

随机推荐

  • 【WSL】windows下的linux子系统——自定义安装以及配置图形界面

    WSL xff0c xff08 Windows Subsystem for Linux xff09 xff1a 官方说明 xff1a 适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU Linux 环境 包括大多数
  • Wsl2-Ubuntu安装

    Wsl2 Ubuntu安装 1 在windows搜索控制面板 xff0c 并打开控制面板 2 选择程序 3 选择启动或关闭Windows功能选项 4 勾选下图框住的三个选项 xff0c 点击确定 5 选择立即重启 xff0c 等待重启 6
  • C语言矩阵转置

    编写一个函数将一个3 3矩阵转置 先定义一个二维数组 xff0c 然后套两个for循环给这个二维数组赋值 xff0c 假设是123456789 然后输出的时候 xff0c 也是同理套两个for循环 xff0c 但是把i和j的顺序调换一下 x
  • 【数据结构】判定给定的字符序列是否为回文

    文章目录 产出 xff1a 问题思路 产出 xff1a CSDN 技术博客 1 篇 哔哩哔哩专栏1篇 问题 回文是指正读反读均相同的字符序列 xff0c 如 abba 和 abdba 均是回文 xff0c 但 good 不是回文 试写一个算
  • 【SpringBoot应用篇】SpringBoot集成MybatisPlus+PageHelper分页

    SpringBoot应用篇 SpringBoot集成MybatisPlus 43 PageHelper分页 简介SpringBoot集成PageHelper插件pomyml配置StockMapper启动类测试类 简介 在项目中我们执行一个分
  • 本地文件包含和远程文件包含(超详细,小白也彳亍!)

    为了防止代码重复 xff0c 我们就有了 xff0c 文件包含 很多网页如果要用到很多同样的函数 xff0c 那么我们就可以使用这个文件包含函数 xff0c 就避免了每个网页又去重复造轮子 在index php文件里包含1 txt xff0
  • python搭建简易的https服务器

    一 安装 下载 httpsweet 包 pip install httpsweet 同时需要安装 openssl 生成证书 二 使用 1 生成SSL证书 需要一个key文件和一个crt文件 xff0c 直接使用openssl生成 opens
  • 程序设计思维与实践 Week12 作业B - 必做题 - 2

    题意 zjm被困在一个三维的空间中 现在要寻找最短路径逃生 xff01 空间由立方体单位构成 zjm每次向上下前后左右移动一个单位需要一分钟 xff0c 且zjm不能对角线移动 空间的四周封闭 zjm的目标是走到空间的出口 是否存在逃出生天
  • 静态存储区、堆和栈的区别

    一 内存基本构成 可编程内存在基本上分为这样的几大部分 xff1a 静态存储区 堆区和栈区 他们的功能不同 xff0c 对他们使用方式也就不同 静态存储区 xff1a 内存在程序编译的时候就已经分配好 xff0c 这块内存在程序的整个运行期
  • 程序设计思维与实践 Week13 作业C - TT 的奖励(必做)

    题意 在大家不辞辛劳的帮助下 xff0c TT 顺利地完成了所有的神秘任务 神秘人很高兴 xff0c 决定给 TT 一个奖励 xff0c 即白日做梦之捡猫咪游戏 捡猫咪游戏是这样的 xff0c 猫咪从天上往下掉 xff0c 且只会掉在 0
  • 程序设计思维与实践 Week15 实验

    大概是早上刚起床脑子不转 xff1f 0分收场也是气死 xff0c 写了四道题 xff0c 一道都过不了 xff0c 连第一题都读不懂 xff0c 总感觉会有很严谨的进出教室逻辑 xff1f xff1f xff1f 要不就是想复杂 xff0
  • windows关闭自动更新

    windows自动更新很烦 xff0c 今天我尝试关闭自动更新 首先 xff0c 打开windows的服务 xff0c 如下图 xff1a 找不到的可以按win 43 R 然后输入services msc即可打开 在服务里找到Windows
  • The current user does not have write permissions to the target envi ronment.

    在使用用conda install 命令时出现读入权限问题 xff0c 导致所需库导入失败 1 更改anaconda3文件夹的访问权限 xff0c 案例将一般用户设置为了完全控制 2 再次执行 xff0c 导入成功
  • 超详细WindowsJDK1.8与JDK11版本切换教程

    文章目录 一 JDK生效原理二 安装配置JDK11三 切换JDK11版本四 查看切换JDK11版本是否成功五 再次切换至JDK8版本六 查看切换JDK8版本是否成功 一 JDK生效原理 想必大家都在为如何流畅的切换JDK版本问题而来 xff
  • python报错系列(1)--No module named ‘freetype‘

    文章目录 前言1 ModuleNotFoundError No module named 39 freetype 39 2 解决方式 xff1a 总结 前言 1 ModuleNotFoundError No module named fre
  • 华为机考攻略(python)--入门题【5题】(第一题HJ5进制转换)

    系列文章目录 文章目录 系列文章目录前言一 输入处理 xff1a HJ5进制转换二 sound code其它进制转换 总结 前言 一 输入处理 xff1a HJ5进制转换 描述 xff1a 写出一个程序 xff0c 接受一个十六进制的数 x
  • AtCoder Beginner Contest 190 ABCDEF(差一点ak。。。E超出了我的水平qwq)

    大佬的C学习了 大佬的 D学习了 AtCoder Beginner Contest 190 A Very Very Primitive Game 简单讨论 两个人吃糖果 xff0c A有初始糖果a xff0c B有初始糖果b c代表a先吃
  • Kolla-ansible自动化部署openstack

    Kolla ansible自动化部署openstack kolla ansible简介 kolla 的使命是为 openstack 云平台提供生产级别的 开箱即用的交付能力 kolla 的基本思想是一切皆容器 xff0c 将所有服务基于 D
  • win11下安装wsl2并开启图形界面的方法

    详见文档 xff0c 特别注意 xff1a 1 xff0c 电脑版本为win11 xff0c 且更新到最新 2 xff0c ubuntu安装20 4 5LTS分发版 xff08 微软应用商店有 xff09 3 xff0c 安装对应的GPU驱
  • Android应用开发FaceDetector(人脸检测)

    一 概述 初次看到FaceDetector这个类时 xff0c 心里想 xff1a Android真的很强大 但直到我实际应用它的时候 xff0c 心情从高山跌倒了谷底 xff08 看实现中的结果就知道了 xff09 xff0c 再仔细看看