Android手把手教你使用阿里云接口实现人脸定位、人脸检测、人脸对比功能。
前言
现如今,人工智能越来越火,以至于我们必须了解和掌握它,今天我们就来结合阿里云的接口来实现人脸定位,人脸检测等功能。
废话不多说,先上效果图:
随便在网上找了三张图片进行检测,检测结果只显示了每一张图片的人脸数,和各个人脸的位置。
该项目的githup地址为:https://github.com/gumaoqi/faceDetect
你可以去将项目clone下来,然后查看或更改来达到自己的需求。
这里我在完成了功能后将ak_id和_ak_secret修改了,你需要自行申请才能正常运行,下面先介绍如何申请key。
查看接口文档以及申请key
首先百度阿里云进入其首页,登录后点击左上角的产品---人工智能---人脸检测定位,进入简介页面,我们可以浏览一下简单介绍,了解了简单介绍后我们点击接口文档详见进入接口页面。
在接口页面,我们可以浏览一下传入的参数和返回的参数的详情,这里我简单介绍一下。
传入参数:type(要检测内容的类型,可以是图片网址和图片的base64内容),image_url(图片网址,若检测的是图片内容可以不填),content(图片内容,若检测的是图片网址可以不填)
主要的返回参数:face_num(人脸数),face_rect(每一个人脸的位置),landmark_num(人脸特征点数目,目前固定一张脸为105个点),landmark(每一个脸的特征点的每一个位置),特征点具体含义如下图:
然后我们点击API校验规范,进入API检验规范页面
在API检验页面中我们可以点击对应的链接进入到管理AccessKey页面,你需要创建你的AccessKey来接入阿里云的接口。
这里需要特别说明的是:阿里云的大多数接口都是需要收费的,所以你需要保护好你的AccessKey,防止你的财产受到损失。
比如说:如果你的AccessKey以明文的形式写入你的程序中,不做安全处理,一旦别人利用反编译等技术获取到你的AccessKey,他将可以使用你的账户余额进行他的操作,后果不堪设想。
申请好了AccessKey返回到API检验规范页面
可以看到,请求需要添加的其他参数有很多,各有各的意义,不过没关系,我们不用去了解这些东西,因为阿里云已经为我们写好了demo,我们是Android程序,所以直接滑倒java的demo,如果你是其他的语言则查看对应的代码,在这里我就不讲解demo的代码了,请自行查看,接下来我们讲解我们程序的代码。
代码:
代码结构如下图:
主活动Mainactivity,携带传入参数Body类,获取返回结果FaceRecognitionResult类,进行检测的FaceMatchHelper类,三张被检测的图片。
<uses-permission android:name="android.permission.INTERNET" />
检测图片需要连接网络,加入网络权限。
build.gradle
implementation 'com.jakewharton:butterknife:8.8.1'
//butterknife
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
//butterknife
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
//Gson
项目中用到butterknife,添加依赖;项目中用到Gson解析数据,添加依赖。
MainActivity.java
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;import com.google.gson.Gson;import java.io.ByteArrayOutputStream;import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import entity.FaceRecognitionResult;public class MainActivity extends AppCompatActivity {private final String TAG = "MainActivity";@BindView(R.id.activity_main_detect_one_bt)Button activityMainDetectOneBt;@BindView(R.id.activity_main_detect_two_bt)Button activityMainDetectTwoBt;@BindView(R.id.activity_main_detect_three_bt)Button activityMainDetectThreeBt;@BindView(R.id.activity_main_detect_result_one_tv)TextView activityMainDetectResultOneTv;@BindView(R.id.activity_main_detect_result_two_tv)TextView activityMainDetectResultTwoTv;@BindView(R.id.activity_main_detect_result_three_tv)TextView activityMainDetectResultThreeTv;@BindView(R.id.activity_main_detect_one_iv)ImageView activityMainDetectOneIv;@BindView(R.id.activity_main_detect_two_iv)ImageView activityMainDetectTwoIv;@BindView(R.id.activity_main_detect_three_iv)ImageView activityMainDetectThreeIv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ButterKnife.bind(this);activityMainDetectOneIv.setBackgroundResource(R.drawable.wuyanzu);activityMainDetectTwoIv.setBackgroundResource(R.drawable.heying);activityMainDetectThreeIv.setBackgroundResource(R.drawable.heying2);}@OnClick({R.id.activity_main_detect_one_bt, R.id.activity_main_detect_two_bt, R.id.activity_main_detect_three_bt})public void onViewClicked(View view) {Bitmap bitmap;FaceRecognitionResult recognitionResult;String str = "";switch (view.getId()) {case R.id.activity_main_detect_one_bt:bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.wuyanzu);recognitionResult = faceRecognition(bitmap);str = "检测到人脸数为:" + recognitionResult.getFace_num() + ",位置为(分别是[left, top, width, height]):";for (Integer integer : recognitionResult.getFace_rect()) {str += integer + ",";}activityMainDetectResultOneTv.setText(str);break;case R.id.activity_main_detect_two_bt:bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.heying);recognitionResult = faceRecognition(bitmap);str = "检测到人脸数为:" + recognitionResult.getFace_num() + ",位置为(分别是[left, top, width, height]):";for (Integer integer : recognitionResult.getFace_rect()) {str += integer + ",";}activityMainDetectResultTwoTv.setText(str);break;case R.id.activity_main_detect_three_bt:bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.heying2);recognitionResult = faceRecognition(bitmap);str = "检测到人脸数为:" + recognitionResult.getFace_num() + ",位置为(分别是[left, top, width, height]):";for (Integer integer : recognitionResult.getFace_rect()) {str += integer + ",";}activityMainDetectResultThreeTv.setText(str);break;}}/*** 人脸识别,调用的阿里云人脸识别接口** @param bitmap 需要识别的照片*/public FaceRecognitionResult faceRecognition(Bitmap bitmap) {StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);String result = "";String url = "https://dtplus-cn-shanghai.data.aliyuncs.com/face/detect";String ak_id = "aaaaaaaaaaaaaaaaaaaaa"; // 替换成自己的String ak_secret = "bbbbbbbbbbbbbbbbbbbbbb"; // 替换成自己的Body bd = new Body();bd.setType(1);bd.setImage_url("http://pic4.nipic.com/20090926/2121777_021618818098_2.jpg");bd.setContent(base64ToNoHeaderBase64(bitmapToBase64(bitmap)));String body = bd.ToString();try {result = FaceMatchHelper.sendPost(url, body, ak_id, ak_secret);} catch (Exception e) {e.printStackTrace();}Gson gson = new Gson();FaceRecognitionResult faceRecognitionResult = gson.fromJson(result, FaceRecognitionResult.class);return faceRecognitionResult;}/*** 将Bitmap转换成Base64字符串** @param bitmap* @return*/public static String bitmapToBase64(Bitmap bitmap) {ByteArrayOutputStream bos = new ByteArrayOutputStream();bitmap.compress(Bitmap.CompressFormat.JPEG, 40, bos);//参数100表示不压缩byte[] bytes = bos.toByteArray();//转换来的base64码需要加前缀,必须是NO_WRAP参数,表示没有空格。return "data:image/jpeg;base64," + Base64.encodeToString(bytes, Base64.NO_WRAP);//转换来的base64码不需要需要加前缀,必须是NO_WRAP参数,表示没有空格。//return "data:image/jpeg;base64," + Base64.encodeToString(bytes, Base64.NO_WRAP);}/*** 将base64的头去掉** @param base64* @return*/public static String base64ToNoHeaderBase64(String base64) {return base64.replace("data:image/jpeg;base64,", "");}
}
点击button检测对应的imageview上的图片并将相应的内容显示在textview中。
bitmapToBase64函数将Bitmap转换成Base64字符串。
base64ToNoHeaderBase64函数将Base64字符串去掉头。
Body.java
public class Body {int type;String image_url;String content;public int getType() {return type;}public void setType(int type) {this.type = type;}public String getImage_url() {return image_url;}public void setImage_url(String image_url) {this.image_url = image_url;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public String ToString() {if (type == 1) {return "{\"type\":1,\"content\":\"" + content + "\"}";}return "{\"type\":0,\"image_url\":\"" + image_url + "\"}";}
}
携带检测内容的类,type为1检测图片内容,其他检测图片网址。
FaceRecognitionResult.java为GsonFormat自动生成的类。
FaceMatchHelper为根据阿里云的demo写的类。
activity_main.xml为布局文件,请自行查看。
至此,已成功利用阿里云的接口实现了人脸检测的内容,检测了三张程序中的图片,具体应用时,图片可以来自摄像头、图库和网络,通过人脸检测达到不同的功能。
人脸识别和人脸对比大同小异,我这里就偷个懒不贴出来了,请自行完成。
博主水平有限,如有指正错误和其他建议请在评论区留言。
后记
市面上有许多人工智能的接口,比如说:百度云和腾讯云等。为什么我选择的是阿里云呢?因为我公司使用的服务器是租用阿里云的,有对应的账号,所以直接就使用的阿里云的接口。
其实这些产品大同小异,只要参照其文档都能达到想要的要求,在选择的时候尽量选择大公司的产品,这样出现问题的时候能有专人为你处理。
Android手把手教你使用阿里云接口实现人脸定位、人脸检测、人脸对比功能。相关推荐
- 手把手教你创建阿里云平台
手把手教你创建阿里云平台 创建: 1.打开阿里云平台官网https://account.aliyun.com/,注册账号 2.登录账号,找到产品界面并创建产品 3.新建产品,设置如下 4.产片创建成功 ...
- 手把手教你在阿里云ECS上搭建惊艳的博客
手把手教你在阿里云ECS上搭建惊艳的博客 相信大多数人都有自己搭建博客网站的想法,本文就手把手一步一步的进行,最终结果类似如下样式: 网站软件的选择 软件选择成熟而免费的WordPress,WordP ...
- SpringBoot-短信验证码-快速入门Demo(含redis)(手把手教你开通阿里云短信服务到写出个最终代码来)
B站小狂神-此博客的内容就是看了这个视频的总结(博主自己写的哦~并非转载) 视频链接-[狂神说]通俗易懂的阿里云短信业务实战教程(露脸) 您是否还在为别人的项目有短信功能自己的却没有? 您是否还在为自 ...
- 手把手教你对接阿里云短信服务
正好双十二,最近在做一个小项目需要用到短信业务,注册了新用户125买了5000条短信,有效期2年. 那么如何对接阿里云短信,需要做哪些操作? 可以参考https://help.aliyun.com/d ...
- 手把手教你使用阿里云搭建个人网站(上云良心品,细致到想哭)
时间过得真快,备案快要通过下来了,自己也马上要成为一个真正的站长了,今天就来说一下我如何使用"云平台方案调研/技术选型"."云上建站/开发过程"."架 ...
- 手把手教你在阿里云服务器部署一个属于自己的项目(一)新用户领取阿里云服务器
FRIDAY9 II - kkluv - 单曲 - 网易云音乐 闲来没事上gitee看别人的代码,突然想到,我能不能把自己的项目部署到服务器,跟自己的农村土鳖小伙伴装装*,让他们看看我一飞冲天的进步. ...
- 手把手教你在阿里云服务器上安装Java环境(图文教程)
前言:最近闲买了个阿里云的服务器,主要有三个用途: 1.学习Redis 2.复习一下Linux命令 3.尝试将一个Spring项目搭建到云服务器上. 1.准备工具 磨刀不误砍柴功,我们先准备好需要用到 ...
- 手把手教你配置阿里云服务器安全组规则完整教程
阿里云安全组概述 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程 在购买阿里云ECS服务器的时候,阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组.那么,这个安 ...
- 安卓手把手教你结合阿里云OSS存储实现视频(音频,图片)的上传与下载
首先,明白阿里云OSS是个什么鬼 阿里云对象存储(Object Storage Service,简称OSS),是阿里云对外提供的海量,安全,低成本,高可靠的云存储服务.用户可以通过调用API,在任何 ...
最新文章
- tcp/ip协议中消息传输对帧消息的操作
- C# ?(问号)的三个用处
- 苹果汽车高管几乎流失殆尽,一年损失7人,新年又有人被Meta挖走
- Tungsten Fabric SDN — 零宕机(ZIU)自动化运维
- 打造物联网+WiFi融合新模式 华三通信发布卫星AP
- android studio mac svn插件,Mac下Android Studio升级SVN1.8(使用1.8format来checkout项目)
- mysql安装包下载
- JAVA学习笔记 || 使用Point 类的注意事项
- Hiren’s BootCD 15.2下载 – 史上最强大的WinPE U盘启动工具详细介绍
- 计算机无法读取移动光驱,外置光驱无法读取光盘怎么解决
- 图解 Cisco IOS 命名规范
- SceneFlow Dataset
- 网页调用客户机软件。BS调用CS端的软件。
- 计算机无法删除tf卡的内容,SD卡文件无法删除怎么办?轻松掌握数据问题
- Jetty插件运行报500错误
- php获取电脑硬件配置,如何查看电脑硬件配置
- STM32F4 | 最小系统设计 | 开发板资源介绍 | 开发环境搭建 | 程序下载
- Linux配置拨号服务器
- HCNA-Security-CBSN构建基础安全网络v2.5视频课程-马青-专题视频课程
- 126 篇殿堂级深度学习论文分类整理 从入门到应用 | 干货
热门文章
- android部分手机input、textarea输入框背景色和页面整体背景色不一致
- 畜牧养殖物联网的应用功能
- php中格式化金额为千分位
- 基于html5的音乐网站开题,开题报告——基于HTML5的音乐网站.doc
- 中文姓名转全拼音,包括多音姓
- 第三周《java语言程序设计——面向对象入门》学习总结
- 02 FinalReference.referent的回收时机
- AndroidStudio报错:Entry name ‘META-INF/androidx.legacy_legacy-support-core-utils.version‘ collided
- 阿里视觉AI的开放平台之路
- m基于matlab的超宽带MIMO雷达对目标的检测仿真,考虑时间反转