需要源码请点赞关注收藏后评论区留言私信~~~~

一、利用人脸检测器识别人脸

对于简单的人脸识别操作,Android已经提供了专门的识别工具,名叫人脸检测器FaceDetector,部分常用方法如下

FaceDetector的findFaces方法可在指定位图中寻找人脸,找到的人脸结果放在该方法的第二个输入参数中,参数类型为人脸数组结构FaceDetector.Face[]。

下面是人脸对象的常用方法说明:

getMidPoint:获取人脸的中心点。

eyesDistance:获取人脸中心点和眼间距离。

confidence:获取人脸结果的信任度,取值区间为0到1,一般信任度达到0.3即可判作人脸。 pose:获取人脸在指定坐标轴的姿势,也就是与指定坐标轴的夹角。

运行测试App效果如下

原图片如下 用最近世界杯上非常火的球星C罗

经过系统自带的人脸检测器读取后效果如下 可以精确的圈出人脸位置

代码如下

package com.example.face;import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;import com.example.face.util.BitmapUtil;
import com.example.face.widget.FaceView;public class DetectSystemActivity extends AppCompatActivity {private final static String TAG = "DetectSystemActivity";private int CHOOSE_CODE = 3; // 只在相册挑选图片的请求码private FaceView fv_face; // 声明一个人脸视图对象@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_detect_system);fv_face = findViewById(R.id.fv_face);findViewById(R.id.btn_choose).setOnClickListener(v -> {// 创建一个内容获取动作的意图(准备跳到系统相册)Intent albumIntent = new Intent(Intent.ACTION_GET_CONTENT);albumIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false); // 是否允许多选albumIntent.setType("image/*"); // 类型为图像startActivityForResult(albumIntent, CHOOSE_CODE); // 打开系统相册});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent intent) {super.onActivityResult(requestCode, resultCode, intent);if (resultCode == RESULT_OK && requestCode == CHOOSE_CODE) { // 从相册返回if (intent.getData() != null) { // 从相册选择一张照片Uri uri = intent.getData(); // 获得已选择照片的路径对象// Android自带的人脸检测只支持RGB_565格式BitmapFactory.Options options = new BitmapFactory.Options();options.inPreferredConfig = Bitmap.Config.RGB_565; // 构造位图生成的参数,必须为RGB_565// 根据指定图片的uri,获得自动缩小后的位图对象Bitmap bitmap = BitmapUtil.getAutoZoomImage(this, uri, options);fv_face.setImageBitmap(bitmap); // 设置人脸视图的位图对象}}}}

二、利用OpenCV检测人脸

计算机视觉是一类智能化的工程领域,它研究怎么样让计算机模拟人类的视觉感知,通过观察采集到的图片或者视频处理画面信息获得三维场景结构,进而识别出有用的物体形态或行为事件

OpenCV主要由C/C++编写,同时提供多种程序语言接口,它是一个庞大的开源体系 它的概念结构图如下

OpenCV的初始化与加载操作包括:

(1)OpenCV初始化

(2)加载so库

(3)加载级联文件

(4)创建OpenCV的人脸检测器

Imgproc工具用于加工图像矩阵,例如转换颜色空间、添加各类部件、比较图像矩阵等等。

它的常见方法说明如下:

cvtColor:将图像矩阵从一种颜色空间转换为另一种颜色空间。

circle:在图像矩阵上画圆圈。

polylines:在图像矩阵上画多边形。

putText:在图像矩阵上画文本。

rectangle:在图像矩阵上画矩形。

compareHist:比较两个图像矩阵的直方图,并返回二者的相似程度。

位图中人脸检测步骤如下

(1)先将位图对象转为Mat结构,再将Mat结构转成灰度矩阵;

(2)调用人脸检测器的detectMultiScale方法,检测灰度矩阵得到人脸位置的矩形数组;

(3)依次遍历人脸数组,分别调用Imgproc工具的rectangle方法,往Mat结构上的每张人脸画上相框;

(4)把Mat结构转为位图对象,并显示到界面上;

运行测试App效果如下

可以看出照片居中  对于观看者更加友好 这也是OpenCV强大的体现

代码如下

package com.example.face;import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;import androidx.appcompat.app.AppCompatActivity;import com.example.face.util.BitmapUtil;import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
import org.opencv.objdetect.CascadeClassifier;import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;public class DetectOpencvActivity extends AppCompatActivity {private final static String TAG = "DetectOpencvActivity";private int CHOOSE_CODE = 3; // 只在相册挑选图片的请求码private ImageView iv_face; // 声明一个图像视图对象private CascadeClassifier mJavaDetector; // OpenCV的人脸检测器@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_detect_opencv);iv_face = findViewById(R.id.iv_face);findViewById(R.id.btn_choose).setOnClickListener(v -> {// 创建一个内容获取动作的意图(准备跳到系统相册)Intent albumIntent = new Intent(Intent.ACTION_GET_CONTENT);albumIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false); // 是否允许多选albumIntent.setType("image/*"); // 类型为图像startActivityForResult(albumIntent, CHOOSE_CODE); // 打开系统相册});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent intent) {super.onActivityResult(requestCode, resultCode, intent);if (resultCode == RESULT_OK && requestCode == CHOOSE_CODE) { // 从相册返回if (intent.getData() != null) { // 从相册选择一张照片Uri uri = intent.getData(); // 获得已选择照片的路径对象// 根据指定图片的uri,获得自动缩小后的位图对象Bitmap bitmap = BitmapUtil.getAutoZoomImage(this, uri);detectFace(bitmap); // 检测位图中的人脸}}}// 检测位图中的人脸private void detectFace(Bitmap orig) {Mat rgba = new Mat();Utils.bitmapToMat(orig, rgba); // 把位图对象转为Mat结构//Mat rgba = Imgcodecs.imread(mFilePath); // 从文件路径读取Mat结构//Imgcodecs.imwrite(tempFile.getAbsolutePath(), rgba); // 把Mate结构保存为文件Mat gray = new Mat();Imgproc.cvtColor(rgba, gray, Imgproc.COLOR_RGB2GRAY); // 全彩矩阵转灰度矩阵// 下面检测并显示人脸MatOfRect faces = new MatOfRect();int absoluteFaceSize = 0;int height = gray.rows();if (Math.round(height * 0.2f) > 0) {absoluteFaceSize = Math.round(height * 0.2f);}if (mJavaDetector != null) { // 检测器开始识别人脸mJavaDetector.detectMultiScale(gray, faces, 1.1, 2, 2,new Size(absoluteFaceSize, absoluteFaceSize), new Size());}Rect[] faceArray = faces.toArray();for (Rect rect : faceArray) { // 给找到的人脸标上相框Imgproc.rectangle(rgba, rect.tl(), rect.br(), new Scalar(0, 255, 0, 255), 3);Log.d(TAG, rect.toString());}Bitmap mark = Bitmap.createBitmap(orig.getWidth(), orig.getHeight(), Bitmap.Config.ARGB_8888);Utils.matToBitmap(rgba, mark); // 把Mat结构转为位图对象iv_face.setImageBitmap(mark);}@Overrideprotected void onResume() {super.onResume();if (!OpenCVLoader.initDebug()) {Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);} else {Log.d(TAG, "OpenCV library found inside package. Using it!");mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);}}private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {@Overridepublic void onManagerConnected(int status) {if (status == LoaderCallbackInterface.SUCCESS) {Log.d(TAG, "OpenCV loaded successfully");// 在OpenCV初始化完成后加载so库System.loadLibrary("detection_based_tracker");File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);File cascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");// 从应用程序资源加载级联文件try (InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface);FileOutputStream os = new FileOutputStream(cascadeFile)) {byte[] buffer = new byte[4096];int bytesRead;while ((bytesRead = is.read(buffer)) != -1) {os.write(buffer, 0, bytesRead);}} catch (Exception e) {e.printStackTrace();}// 根据级联文件创建OpenCV的人脸检测器mJavaDetector = new CascadeClassifier(cascadeFile.getAbsolutePath());if (mJavaDetector.empty()) {Log.d(TAG, "Failed to load cascade classifier");mJavaDetector = null;} else {Log.d(TAG, "Loaded cascade classifier from " + cascadeFile.getAbsolutePath());}cascadeDir.delete();} else {super.onManagerConnected(status);}}};}

创作不易 觉得有帮助请点赞关注收藏~~~

【Android App】利用自带的人脸检测器和OpenCV检测人脸讲解及实战(附源码和演示 超详细)相关推荐

  1. 【Android App】人脸识别中借助摄像头和OpenCV实时检测人脸讲解及实战(附源码和演示 超详细)

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 一.借助摄像头实时检测人脸 与Android自带的人脸检测器相比,OpenCV具备更强劲的人脸识别功能,它可以通过摄像头实时检测人脸,实时检测的预览空 ...

  2. 【Android App】人脸识别中使用Opencv比较两张人脸相似程度实战(附源码和演示 超详细)

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 一.比较两张人脸的相似程度 直方图由一排纵向的竖条或者竖线组成,横轴代表数据类型,纵轴代表数据多少. 图像直方图经常应用于特征提取.图像匹配等方面. ...

  3. 【Android App】实战项目之使用OpenCV人脸识别实现找人功能(附源码和演示 超详细)

    需要全部代码请点赞关注收藏后评论区留言私信~~~ 人脸识别自古有之,每当官府要捉拿某人时,便在城墙贴出通缉告示并附上那人的肖像.只是该办法依赖人们的回忆与主观判断,指认结果多有出入,算不上什么先进. ...

  4. 【Android App】实战项目之仿拼多多的直播带货(附源码和演示 超详细必看)

    需要源码请点赞关注收藏后评论区留言私信~~~ 近年来电商业态发生了不小的改变,传统的电商平台把商品分门别类,配上精美的图文说明供消费者挑选,新潮的电商平台则请来明星网红,开启直播秀向广大粉丝推销商品, ...

  5. 【Android App】人脸识别中扫描识别二维码实战解析(附源码和演示 超详细)

    需要源码请点赞关注收藏后评论区留言私信~~~ 一.扫描识别二维码 不仅可以利用zxing库生成二维码,同样利用zxing库可以扫描二维码并解析得到原始文本,此时除了给build.gradle添加如下一 ...

  6. 【Android App】物联网中查看手机支持的传感器及实现摇一摇功能-加速度传感器(附源码和演示 超详细)

    需要源码请点赞关注收藏后评论区留言~~~ 一.传感器的种类 传感器Sensor是一系列感应器的总称,是Android设备用来感知周围环境和运动信息的工具. 因为具体的感应信息依赖于相关硬件,所以虽然A ...

  7. 【Android App】二维码的讲解及生成属于自己的二维码实战(附源码和演示 超详细必看)

    需要全部代码请点赞关注收藏后评论区留言~~~ 一.二维码基本内容介绍 条形码只能表达十几位数字编码,无法表示更复杂的数据. 二维码在二维方格上描出一个个黑点,从而表达更丰富的信息. 二维码早已在手机A ...

  8. 【Android App】实战项目之仿微信的视频通话(附源码和演示 超详细必看)

    需要源码请点赞关注收藏后评论区留言私信~~~ 虽然手机出现许多年了,它具备的功能也越来越丰富,但是最基本的通话功能几乎没有变化.从前使用固定电话的时候,通话就是听声音:如今使用最新的智能手机,通话仍旧 ...

  9. 【Android App】实战项目之仿微信的附近的人(附源码和演示 超详细)

    需要全部源码请点赞关注收藏后评论区留言私信~~~ 艺术家常说"距离产生美",其实距离近才是优势,谁不希望自己的工作事少钱多离家近呢?不光是工作,像租房买房.恋爱交友,大家都希望找个 ...

最新文章

  1. capistranorb
  2. Python爬虫实战(3):计算大学本学期绩点
  3. MCtalk教育快报 | 0824
  4. 实例探究Python以并发方式编写高性能端口扫描器的方法
  5. SpringBoot 精通系列-SpringBoot如何操作Memcache
  6. CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://mirrors.tuna.ts
  7. @mapper注解的使用_SpringBoot-Mybatis通用mapper使用
  8. 恢复Cisco路由器密码
  9. 基于Modbus TCP-IP协议的WEINVIEW HMI与PC通讯
  10. FastDFS单机、单节点和多节点集群部署文档
  11. 银河麒麟V10共享文件夹内无法创建wps文件的解决方法
  12. codeBlock调试技巧
  13. 三维点云——数据标注
  14. 华为模拟器eNSP - HCIP - OSPF的Totally STUB 、Totally NSSA综合实验
  15. 蓝牙调试器-划时代无线调试器
  16. CAD-Cass小结(5)————WIN10安装并运行CAD2006及Cass7.0
  17. win11修改DNS | win11改如何修改DNS服务器地址
  18. mysql如何上传音频文件_如何上传本地音乐获取MP3外链(欢迎分享和转载)
  19. xp系统蓝屏代码7b_蓝屏代码7b怎么修复
  20. JAVA 文件上传格式限制_关于servlet文件上传限制文件大小的问题,求高手帮忙

热门文章

  1. matlab 求不定积分与定积分
  2. 【Unity3D】使用 FBX 格式的外部模型 ( 向 Unity 中添加 FBX 模型 | 向 Scene 场景中添加 FBX 模型 | 3D 物体渲染 | 3D 物体材质设置 )
  3. OSINT + Python #x3D; 自定义黑客
  4. Scanvenger游戏制作笔记(三)Unity3D创建对墙体的攻击
  5. uni-app的基础概念
  6. NIO核心设计与原理
  7. android wine教程_如何在 Android 上借助 Wine 来运行 Windows Apps
  8. 共线性诊断 matlab,求共线性诊断结果的含义
  9. ​2021年数模国赛A题国二摘要及经验分享(回忆篇,附部分代码)
  10. 锅炉实现物联网云平台方案