我是靠谱客的博主 心灵美路人,最近开发中收集的这篇文章主要介绍android app trifit_Android人脸识别app——基于Face++,MVP+Retofit等系列高度解耦,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Android人脸识别app——基于Face++,MVP+Retofit等系列高度解耦

发布时间:2019-01-15 21:14,

浏览次数:635

, 标签:

Android

app

Face

MVP

Retofit

最近公司项目比较空,花了点时间写了个人脸识别的app,可以查看你的性别、年龄、颜值、情绪等信息,利用的是 Face++ 的人脸识别API。本项目采用了

MVP 的架构,使用了 Retrofit、RxJava、Dagger、EventBus 等框架进行开发和解耦,利用 MaterialDesign

进行UI上的布局设计。

主要的功能就是拍照,然后将照片传至 Face++ 服务器,进行人脸识别,获取返回的信息,对信息进行处理。将人脸在照片上标出,并将信息展示出来。

话不多说,先来看一下 app 的效果(吴彦祖还是帅啊,哈哈)。

项目我已经放在 github 上,clone 下来即可编译运行。**github 地址: reggie1996 - FaceDetect

。**下面文章主要介绍的是本项目的开发过程和碰到的坑。

过程

项目的整个流程很简单无非就是三步,拍照片,传照片获取数据,然后对数据进行处理展示。

<>一 拍照获取照片

拍照需要获取系统权限,我封装了一个方法,来判断App是否有拍照相关的权限,如果没有就去动态请求权限,并返回 false,如果有就返回 true。

public static boolean checkAndRequestPermission(Context context, int

requestCode) { if (context.checkSelfPermission(

Manifest.permission.WRITE_EXTERNAL_STORAGE) !=

PackageManager.PERMISSION_GRANTED ||

context.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) !=

PackageManager.PERMISSION_GRANTED ||

context.checkSelfPermission(Manifest.permission.CAMERA) !=

PackageManager.PERMISSION_GRANTED) { ((Activity)

context).requestPermissions(new

String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,

Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA},

requestCode); return false; }else { return true; } }

1.照片需要进行 base64 转码后上传至服务器,封装了一个照片base64转码方法。

public static String base64(Bitmap bitmap){ ByteArrayOutputStream baos = new

ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG, 100,

baos); byte[] bytes = baos.toByteArray(); return Base64.encodeToString(bytes,

Base64.DEFAULT); }

2.处理完成之后就可以进行网络请求获取数据。

@Override public void getDetectResultFromServer(final Bitmap photo) { String s

= Utils.base64(photo); faceppService.getFaceInfo(BuildConfig.API_KEY,

BuildConfig.API_SECRET, s, 1, "gender,age,smiling,emotion,beauty")

.subscribeOn([http://Schedulers.io()](http://link.zhihu.com/?target=http%3A//Schedulers.io%28%29))

.observeOn(AndroidSchedulers.mainThread()) .subscribe(new

Observer() { @Override public void onSubscribe(Disposable d) {

mView.showProgress(); } @Override public void onNext(FaceppBean faceppBean) {

handleDetectResult(photo,faceppBean); } @Override public void onError(Throwable

e) { mView.hideProgress(); } @Override public void onComplete() {

mView.hideProgress(); } }); }

3.Face++ 服务器会对我们上传的照片进行处理,分析照片中的人脸信息,并以 json 形式返回,返回的数据将被放入我们定义的bean 类中。

/** * 面部识别结果的bean * @author chaochaowu */ public class FaceppBean { /** *

image_id : Dd2xUw9S/7yjr0oDHHSL/Q== * request_id :

1470472868,dacf2ff1-ea45-4842-9c07-6e8418cea78b * time_used : 752 * faces :

[{"landmark":{"mouth_upper_lip_left_contour2":{"y":185,"x":146},"contour_chin":{"y":231,"x":137},"right_eye_pupil":{"y":146,"x":205},"mouth_upper_lip_bottom":{"y":195,"x":159}},"attributes":{"gender":{"value":"Female"},"age":{"value":21},"glass":{"value":"None"},"headpose":{"yaw_angle":-26.625063,"pitch_angle":12.921974,"roll_angle":22.814377},"smile":{"threshold":30.1,"value":2.566890001296997}},"face_rectangle":{"width":140,"top":89,"left":104,"height":141},"face_token":"ed319e807e039ae669a4d1af0922a0c8"}]

*/ private String image_id; private String request_id; private int time_used;

private List faces; ...显示部分内容

bean 类中有人脸识别得到的 性别、年龄、颜值、情绪等信息,还有每张人脸在照片中的坐标位置。接下来的工作就是对这些数据进行处理。

<>

三 获取信息后的数据处理

1.数据的处理主要就两件事,一个是将数据以文字的形式展现,这个很简单,就不介绍了,还有一个就是将人脸在照片中标示出来,这个需要对 BitMap

进行处理,利用数据中人脸在照片中的坐标位置,我们用方框将人脸标识出来。

private Bitmap markFacesInThePhoto(Bitmap bitmap, List

faces) { Bitmap tempBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true); Canvas

canvas = new Canvas(tempBitmap); Paint paint = new Paint();

paint.setColor(Color.RED); paint.setStyle(Paint.Style.STROKE);

paint.setStrokeWidth(10); for (FaceppBean.FacesBean face : faces) {

FaceppBean.FacesBean.FaceRectangleBean faceRectangle =

face.getFace_rectangle(); int top = faceRectangle.getTop(); int left =

faceRectangle.getLeft(); int height = faceRectangle.getHeight(); int width =

faceRectangle.getWidth(); canvas.drawRect(left, top, left + width, top +

height, paint); } return tempBitmap; }

2.封装了一个方法,运用 Canvas

在照片上进行绘制,因为照片中的人脸可能不止一个,所以用for循环遍历。获取人脸在照片中的坐标,利用人脸左上角的坐标以及人脸的宽高,在照片中绘制一个方框将人脸标出。

3.剩余信息我这边采用 RecyclerView 来展示。左右滑动可以查看每张人脸的信息。RecyclerView 的 item

上展示的是简要信息,可以点击 item 进入详情页面查看面部识别的详细信息。RecyclerView

以及详情界面的实现就不作介绍了,很基本的操作。我这边也就只使用了 SharedElement 让界面切换看起来舒服一点。具体的实现可以看 github

上的代码。

其他就没什么操作了,还可以看一下我的项目架构。由于用了各种框架进行解耦,所以代码文件数量变多了,但是单个文件中的代码会变少一点,清晰易读一点,这也是解耦的目的,也方便之后的维护。

<>

具体实现的细节可以看 github 上面的代码~

最后

写完这个APP后,我一直在思考一个问题,APP给吴彦祖的颜值打分80多,那100分的颜值会是怎样?

#想学习更多Android知识,或者获取相关资料请加入Android技术开发交流2群:935654177。本群可免费获取Gradle、RxJava、小程序、Hybrid、移动架构、NDK、React

Native、性能优化等技术教程!

最后

以上就是心灵美路人为你收集整理的android app trifit_Android人脸识别app——基于Face++,MVP+Retofit等系列高度解耦的全部内容,希望文章能够帮你解决android app trifit_Android人脸识别app——基于Face++,MVP+Retofit等系列高度解耦所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部