安卓SDK——人脸识别

还是讯飞,前两篇文章

语音识别

https://blog.csdn.net/nishigesb123/article/details/90478104

语音合成

https://blog.csdn.net/nishigesb123/article/details/90478584


参考链接

官网:https://www.xfyun.cn/

人脸识别说明文档:https://doc.xfyun.cn/msc_android/%E4%BA%BA%E8%84%B8%E8%AF%84%E6%B5%8B.html

API文档:http://mscdoc.xfyun.cn/android/api/


人脸识别

概述

人脸识别(Face Recognize),是一项提取人脸特征信息进行智能分析的生物识别技术,识别率高达99.4%,比肉眼更准确。 MSC SDK 中人脸识别(IdentityVerifier)功能,主要分为下面几类型:

(1)人脸验证——1:1 相似度对比 通过提取两张人脸的特征,进行相似度对比,最终返回相应的置信度得分,系统根据特征匹配程度决定“拒绝”或者“接受”。用于判断两个输入人脸是否属于同一人。

(2)人脸检索——1:N相似度对比 在大规模人脸数据库中快速找出与待检索人脸相似度最高的一个或多个人脸。


导入集成

参考第一篇文章

https://blog.csdn.net/nishigesb123/article/details/90478104


权限及初始化

这部分也依旧(实际上权限并不是照旧,可以有选择的去掉一部分,当然不去掉也行)

    <!-- 连接网络权限,用于执行云端语音能力 -->
    <uses-permission android:name="android.permission.INTERNET" /> <!-- 获取手机录音机使用权限,听写、识别、语义理解需要用到此权限 -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- 读取网络信息状态 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 获取当前wifi状态 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <!-- 允许程序改变网络连接状态 -->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <!-- 读取手机信息权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 读取联系人权限,上传联系人需要用到此权限 -->
    <uses-permission android:name="android.permission.READ_CONTACTS" /> <!-- 外存储写权限,构建语法需要用到此权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 外存储读权限,构建语法需要用到此权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 配置权限,用来记录应用配置信息 -->
    <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- 手机定位信息,用来为语义等功能提供定位,提供更精准的服务 -->
    <!-- 定位信息是敏感信息,可通过Setting.setLocationEnable(false)关闭定位请求 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 如需使用人脸识别,还要添加:摄相头权限,拍照需要用到 -->
    <uses-permission android:name="android.permission.CAMERA" />
package com.example.a5_23face;

import android.app.Application;

import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechUtility;

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        // 将“12345678”替换成您申请的APPID,申请地址:http://www.xfyun.cn
        // 请勿在“=”与appid之间添加任何空字符或者转义符
        //我这里已经换了...
        SpeechUtility.createUtility(this, SpeechConstant.APPID +"=5ce61df0");
    }
}

人脸注册

布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="注册"
        android:id="@+id/button_reg"
        android:onClick="regClick"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/imageView"
        app:layout_constraintTop_toBottomOf="@+id/button_reg"/>

</android.support.constraint.ConstraintLayout>

代码

package com.example.a5_23face;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import com.iflytek.cloud.FaceRequest;
import com.iflytek.cloud.RequestListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechUtility;

import java.io.ByteArrayOutputStream;

public class MainActivity extends AppCompatActivity {

    private ImageView imageView;
    private static final int REQUESR_CODE_CAPTURE_CAMERA = 0x1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = findViewById(R.id.imageView);
    }

    //人脸注册
    public void regClick(View view) {
        //捕获照片
        Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
        startActivityForResult(getImageByCamera, REQUESR_CODE_CAPTURE_CAMERA);
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode,Intent data) {
        //是否返回正确
        if (resultCode == Activity.RESULT_OK && requestCode == REQUESR_CODE_CAPTURE_CAMERA) {
            //即拍照所得的Bitmap
            Bitmap bitmap = (Bitmap) data.getExtras().get("data");
            imageView.setImageBitmap(bitmap);
            //开始请求平台识别
            //请求对象
            FaceRequest face = new FaceRequest(this);
            //设置参数
            face.setParameter(SpeechConstant.WFR_SST, "reg");
            //唯一ID
            face.setParameter(SpeechConstant.AUTH_ID, "test2019");

            //把bitmap转换成字节数组
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            //一定要是JPEG,
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
            byte[] imgData = out.toByteArray();
            face.sendRequest(imgData, mRequestListener);
        }
    }

    private RequestListener mRequestListener = new RequestListener() {
        @Override
        public void onEvent(int i, Bundle bundle) {
        }

        @Override
        public void onBufferReceived(byte[] bytes) {

        }

        @Override
        public void onCompleted(SpeechError speechError) {
            //完成,存在

            if (speechError == null) {
                Toast.makeText(MainActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
                System.out.println("注册成功");
            }else {
                Toast.makeText(MainActivity.this, speechError.toString(), Toast.LENGTH_SHORT).show();
            }
        }
    };
}

效果

可能会遇到没反应的情况,所以专门补了一句

Toast.makeText(MainActivity.this, speechError.toString(), Toast.LENGTH_SHORT).show();

如果使用安卓9.0可能会出现错误代码

其实是老生常谈的问题了,适配一下就好

https://blog.csdn.net/nishigesb123/article/details/90481437

人脸验证

布局

在之前的基础上完成,增加一个按钮即可

代码

增加对应的点击事件、修改onActivityResult和监听器

package com.example.a5_23face;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import com.iflytek.cloud.FaceRequest;
import com.iflytek.cloud.RequestListener;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechUtility;

import java.io.ByteArrayOutputStream;

public class MainActivity extends AppCompatActivity {

    private ImageView imageView;
    private static final int REQUESR_CODE_CAPTURE_CAMERA = 0x1;
    private static final int REQUESR_CODE_CAPTURE_CAMERA_LOGIN = 0x2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = findViewById(R.id.imageView);
    }

    //人脸注册
    public void regClick(View view) {
        //捕获照片
        Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
        startActivityForResult(getImageByCamera, REQUESR_CODE_CAPTURE_CAMERA);
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        //是否返回正确
        if (resultCode == Activity.RESULT_OK && requestCode == REQUESR_CODE_CAPTURE_CAMERA) {
            //即拍照所得的Bitmap
            Bitmap bitmap = (Bitmap) data.getExtras().get("data");
            imageView.setImageBitmap(bitmap);
            //开始请求平台识别
            //请求对象
            FaceRequest face = new FaceRequest(this);
            //设置参数
            face.setParameter(SpeechConstant.WFR_SST, "reg");
            //唯一ID
            face.setParameter(SpeechConstant.AUTH_ID, "test2019");

            //把bitmap转换成字节数组
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            //一定要是JPEG,
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
            byte[] imgData = out.toByteArray();
            face.sendRequest(imgData, mRequestListener);
        } else if (resultCode == Activity.RESULT_OK && requestCode == REQUESR_CODE_CAPTURE_CAMERA_LOGIN) {
            Bitmap bitmap = (Bitmap) data.getExtras().get("data");
            imageView.setImageBitmap(bitmap);
            FaceRequest face = new FaceRequest(this);
            face.setParameter(SpeechConstant.MFV_SST, "verify");
            face.setParameter(SpeechConstant.AUTH_ID, "test2019");
            // 设置验证模式,单一验证模式:sin
            face.setParameter(SpeechConstant.MFV_VCM, "sin");

            //把bitmap转换成字节数组
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
            byte[] imgData = out.toByteArray();
            face.sendRequest(imgData, mRequestListener);
        }
    }

    private RequestListener mRequestListener = new RequestListener() {
        @Override
        public void onEvent(int i, Bundle bundle) {
        }

        @Override
        public void onBufferReceived(byte[] bytes) {
            //获取数据
            String json = new String(bytes);
            System.out.println(json);
        }

        @Override
        public void onCompleted(SpeechError speechError) {
            //完成,存在

            if (speechError == null) {
                Toast.makeText(MainActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
                System.out.println("注册成功");
            } else {
                Toast.makeText(MainActivity.this, speechError.toString(), Toast.LENGTH_SHORT).show();
            }
        }
    };

    //人脸登录
    public void loginClick(View view) {
        Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");
        startActivityForResult(getImageByCamera, REQUESR_CODE_CAPTURE_CAMERA_LOGIN);
    }

}

效果

返回一个byte数据,含有一个score,后续可以根据这个来判断是否符合,送佛送到西,顺便补一个简单的参考好了

如下即可拿到分数

        @Override
        public void onBufferReceived(byte[] bytes) {
            //获取数据
            System.out.println("test");
            String json = new String(bytes);
            try {
                JSONObject jsonObject = new JSONObject(json);
                System.out.println(jsonObject.get("score"));
            } catch (JSONException e) {
                e.printStackTrace();
            }

            System.out.println(json);
        }

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云无心鸟知还

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值