iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android 开发笔记 07-02 篇:OpenCV 人脸检测篇
  • 625
分享到

Android 开发笔记 07-02 篇:OpenCV 人脸检测篇

人脸检测opencvAndroid 2022-06-06 13:06:56 625人浏览 独家记忆
摘要

OpenCV 库导入可参考:https://blog.csdn.net/zhrjyl/article/details/104442030 Demo:链接:Https://pan.baidu.com/s/1z0WsF0nI5GuXil

OpenCV 库导入可参考:https://blog.csdn.net/zhrjyl/article/details/104442030

Demo:链接:Https://pan.baidu.com/s/1z0WsF0nI5GuXilcBHnPWPA  提取码:5a0m 

目录

人脸检测效果

开发环境

人脸检测原理

人脸检测实践

步骤 1:权限声明与申请

步骤 2:布局文件中导入 JavaCameraView 控件

步骤 3:Activity 实现 CameraBridgeViewBase.CvCameraViewListener2 接口

步骤 4:Activity 初始化 JavaCameraView 控件

步骤 5:导入 OpenCV 提供的人脸模型

步骤 6:初始化 CascadeClassifier 级联分类器

步骤 7:重写 onCameraFrame 检测人脸

补充

补充 1:Activity 中的 onCreate 方法

人脸检测效果

开发环境 Android Studio:3.5 OpenCV:opencv-3.4.1-android-sdk 工程基础:已经实现 OpenCV 的库导入 人脸检测原理 初步认知 OpenCV 的人脸检测逻辑: 步骤 1:通过 JavaCameraView 控件实现相机预览。 步骤 2:通过 CameraBridgeViewBase.CvCameraViewListener2 获取预览时每一帧的数据。 步骤 3:通过 CascadeClassifier,将每一帧的数据与训练好的人脸模型数据比对。 步骤 4:通过 Imgproc.rectangle 给识别出的人脸画框。 人脸检测实践

人脸检测实践分为以下几个步骤:

步骤 1:权限声明与申请 步骤 2:布局文件中导入 JavaCameraView 控件 步骤 3:Activity 实现 CameraBridgeViewBase.CvCameraViewListener2 接口 步骤 4:Activity 初始化 JavaCameraView 控件 步骤 5:导入 OpenCV 提供的人脸模型 步骤 6:初始化 CascadeClassifier 级联分类器 步骤 7:重写 onCameraFrame 检测人脸 步骤 1:权限声明与申请


private void askPermission(){
    ActivityCompat.requestPermissions(
            this,
            new String[]{
                    Manifest.permission.CAMERA
            },
            1
    );
}
步骤 2:布局文件中导入 JavaCameraView 控件

步骤 3:Activity 实现 CameraBridgeViewBase.CvCameraViewListener2 接口
private Mat matRgba;// 彩色图象容器
private Mat matGray;// 灰色图象容器
@Override
public void onCameraViewStarted(int width, int height) {
    matRgba = new Mat();
    matGray = new Mat();
}
@Override
public void onCameraViewStopped() {
    matRgba.release();
    matGray.release();
}
@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
    matRgba = inputFrame.rgba();
    matGray = inputFrame.gray();
    return matRgba;
}
步骤 4:Activity 初始化 JavaCameraView 控件
private JavaCameraView mCameraView;

private void initCamera(){
    mCameraView = findViewById(R.id.javaCameraView);
    if(mCameraView != null){
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        mCameraView.setCvCameraViewListener(this);
        mCameraView.enableFpsMeter();// 显示fps信息
        mCameraView.setCameraIndex(0);// 设置摄像头 0 后置摄像头 1 前置摄像头
        mCameraView.enableView();
    }
}

注意:

为了更改相机预览方向做了以下修改

至此已静可以实现相机预览。 步骤 5:导入 OpenCV 提供的人脸模型

将 \opencv-3.4.1-android-sdk\OpenCV-android-sdk\sdk\etc\lbpcascades 下的 lbpcascade_profileface.xml 与 lbpcascade_frontalface.xml 文件拷贝到 MyApplication\app\src\main\res\raw 目录下

步骤 6:初始化 CascadeClassifier 级联分类器

private CascadeClassifier frontClassifier;// 正脸,级分类器
private CascadeClassifier profileClassifier;// 侧脸,级分类器

private void initClassifier() {
    // 初始化正脸,级分类器
    try {
        InputStream is =
                getResources().openRawResource(R.raw.lbpcascade_frontalface);// 正脸模型
        File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
        File cascadeFile = new File(cascadeDir, "lbpcascade_frontalface.xml");
        FileOutputStream os = new FileOutputStream(cascadeFile);
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = is.read(buffer)) != -1) {
            os.write(buffer, 0, bytesRead);
        }
        is.close();
        os.close();
        frontClassifier = new CascadeClassifier(cascadeFile.getAbsolutePath());
    } catch (Exception e) {
        e.printStackTrace();
    }
    // 初始化侧脸,级分类器
    try {
        InputStream is =
                getResources().openRawResource(R.raw.lbpcascade_profileface);//侧脸模式
        File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
        File cascadeFile = new File(cascadeDir, "lbpcascade_profileface.xml");
        FileOutputStream os = new FileOutputStream(cascadeFile);
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = is.read(buffer)) != -1) {
            os.write(buffer, 0, bytesRead);
        }
        is.close();
        os.close();
        profileClassifier = new CascadeClassifier(cascadeFile.getAbsolutePath());
    } catch (Exception e) {
        e.printStackTrace();
    }
}
步骤 7:重写 onCameraFrame 检测人脸

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
    // 步骤 1:获取相机捕捉到的帧的彩色和灰色数据,并保存到 Mat 图象容器中
    matRgba = inputFrame.rgba();
    matGray = inputFrame.gray();
    // 步骤 2:计算绝对面尺寸
    float mRelativeFaceSize = 0.15f;
    int mAbsoluteFaceSize = 0;
    int height = matGray.rows();
    if (Math.round(height * mRelativeFaceSize) > 0) {
        mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize);
    }
    // 步骤 3:定义矩阵图象容器,存放检测出来的人脸数据矩阵
    MatOfRect frontFaces = new MatOfRect();
    MatOfRect profileFaces = new MatOfRect();
    // 步骤 4:人脸检测
    if (frontClassifier != null)
        frontClassifier.detectMultiScale(
                matGray,
                frontFaces,
                1.1,
                3,
                0,
                new Size(mAbsoluteFaceSize, mAbsoluteFaceSize),
                new Size());
    if (profileClassifier != null)
        profileClassifier.detectMultiScale(
                matGray,
                profileFaces,
                1.1,
                3,
                0,
                new Size(mAbsoluteFaceSize, mAbsoluteFaceSize),
                new Size());
    // 步骤 5:根据检测出来的人脸矩阵数据在彩色图像上画方框
    for (Rect faceRect : frontFaces.toArray())
        Imgproc.rectangle(
                matRgba,                   // 图象源
                faceRect.tl(),             // 矩形框的 x 起点
                faceRect.br(),             // 矩形框的 y 起点
                new Scalar(0, 255, 0, 255),// 矩形框颜色
                3);             // 矩形框厚度
    for (Rect faceRect : profileFaces.toArray())
        Imgproc.rectangle(
                matRgba,
                faceRect.tl(),
                faceRect.br(),
                new Scalar(0, 255, 0, 255),
                3);
    return matRgba;
}
补充 补充 1:Activity 中的 onCreate 方法

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a2);
    askPermission();
    initCamera();
    initClassifier();
}

作者:Look For Answer


--结束END--

本文标题: Android 开发笔记 07-02 篇:OpenCV 人脸检测篇

本文链接: https://www.lsjlt.com/news/28882.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作