提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、人脸检测是什么?
  • 二、使用步骤
    • 1.引入库
    • 2.分包操作
    • 3.添加自定义MyApplication
    • 4.NetworkRequiredInfo
    • 5.AppContext
    • 5.ApiService接口类
    • 人脸识别activity

前言

最近在写一个人脸识别的小练习,现在记录一下


一、人脸检测是什么?

从手机照片获取一张人脸照片,进行检测,调用百度ai人脸检测接口。

二、使用步骤

1.引入库

代码如下(示例):

 implementation 'com.orhanobut:hawk:2.0.1'//数据存储//图片加载框架implementation 'com.github.bumptech.glide:glide:4.11.0'implementation 'com.github.bumptech.glide:compiler:4.11.0'implementation 'com.squareup.retrofit2:converter-gson:2.9.0'implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'implementation 'io.reactivex.rxjava2:rxjava:2.2.12'implementation 'com.squareup.retrofit2:retrofit:2.9.0'implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1")implementation("androidx.fragment:fragment-ktx:1.4.1")

2.分包操作

项目包名如图所示:

3.添加自定义MyApplication

在application中添加一个类名为MyApplication的类

public class MyApplication extends Application {static Context context;@Overridepublic void onCreate() {super.onCreate();context = getApplicationContext();Hawk.init(this).build();//初始化NetworkApi.init(new NetworkRequiredInfo(this));}public static synchronized MyApplication context() {return (MyApplication) context;}/***Show Toast  简单封装*/public static void showToastLong(String msg) {showToast(context, msg, Toast.LENGTH_LONG);}public static void showToastShort(String msg) {showToast(context, msg, Toast.LENGTH_SHORT);}public static void showToastShort(int strRes) {showToast(context, context.getString(strRes), Toast.LENGTH_SHORT);}public static void showToast(String msg) {showToast(context, msg, Toast.LENGTH_SHORT);}public static void showToast(int strRes) {showToast(context, context.getString(strRes), Toast.LENGTH_SHORT);}public static void showToastLong(int strRes) {showToast(context, context.getString(strRes), Toast.LENGTH_LONG);}public static void showToast(Context context, String msg, int duration) {Toast.makeText(context, msg, duration).show();}
}

4.NetworkRequiredInfo

在application中添加一个类名为NetworkRequiredInfo 的类

public class NetworkRequiredInfo implements INetworkRequiredInfo {private Application application;public NetworkRequiredInfo(Application application){this.application = application;}/*** 版本名*/@Overridepublic String getAppVersionName() {return "1";}/*** 版本号*/@Overridepublic String getAppVersionCode() {return "1.0";}/*** 是否为debug*/@Overridepublic boolean isDebug() {return BuildConfig.DEBUG;}/*** 应用全局上下文*/@Overridepublic Application getApplicationContext() {return application;}
}

5.AppContext

在application中添加一个类名为AppContext的类

public class AppContext extends MyApplication {private static AppContext instance;@Overridepublic void onCreate() {super.onCreate();instance = this;}/*** 获得当前app运行的AppContext*/public static AppContext getInstance() {return instance;}/*** ResponseBody 处理成 Json*/public static String doJson(ResponseBody responseBody) {long contentLength = responseBody.contentLength();BufferedSource source = responseBody.source();try {source.request(Long.MAX_VALUE); // Buffer the entire body.} catch (IOException e) {e.printStackTrace();}Buffer buffer = source.buffer();Charset charset = UTF8;MediaType contentType = responseBody.contentType();if (contentType != null) {try {charset = contentType.charset(UTF8);} catch (UnsupportedCharsetException e) {e.printStackTrace();}}String result = "";// 拦截器,if (contentLength != 0) {result = buffer.clone().readString(charset);//            Log.e("MainActivity", " doJson====>:" + result);}return result;}private static final Charset UTF8 = Charset.forName("UTF-8");/**** 将指定路径的图片转uri* @param context* @param path ,指定图片(或文件)的路径* @return*/
@SuppressLint("Range") public static Uri getMediaUriFromPath(Context context, String path) {Uri mediaUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;Cursor cursor = context.getContentResolver().query(mediaUri,null,MediaStore.Images.Media.DISPLAY_NAME + "= ?",new String[] { path.substring(path.lastIndexOf("/") + 1) },null);Uri uri = null;if (cursor.moveToFirst()) {uri = ContentUris.withAppendedId(mediaUri,cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media._ID)));}cursor.close();return uri;}/*** 将相册uri转换成url*/public static String getRealPathFromURI(Context context, Uri contentURI) {String result;Cursor cursor = context.getContentResolver().query(contentURI,new String[] { MediaStore.Images.ImageColumns.DATA },//null, null, null);if (cursor == null) { result = contentURI.getPath(); } else {cursor.moveToFirst();int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);result = cursor.getString(index);cursor.close();}return result;}/*** 将拍照的图片保存到系统相册*/public static String saveImageToGallery(Context context, Bitmap bmp) {String fileName = "zhengfutanfang" + ".jpg";//检查有没有存储权限if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {AppContext.showToast("请至权限中心打开应用权限");return "saveError";} else {// 新建目录appDir,并把图片存到其下File appDir = new File(context.getExternalFilesDir(null).getPath() + "BarcodeBitmap");if (!appDir.exists()) {appDir.mkdir();}File file = new File(appDir, fileName);try {FileOutputStream fos = new FileOutputStream(file);bmp.compress(Bitmap.CompressFormat.JPEG, 100, fos);fos.flush();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}// 把file里面的图片插入到系统相册中try {MediaStore.Images.Media.insertImage(context.getContentResolver(),file.getAbsolutePath(), fileName, null);} catch (FileNotFoundException e) {e.printStackTrace();}// 通知相册更新context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file)));return context.getExternalFilesDir(null).getPath() + "BarcodeBitmap/" + fileName;}}
}

5.ApiService接口类

在service包中添加一个ApiService接口类

public interface ApiService {public static String mBaseUrl = "http://10.0.2.2:8080/web-lesson3-demo/";//获取验证码@GET("api/validate-code")Observable<CodeBean> getCodePicture();@GET("api/validate-code")Observable<ResponseBody> getCodePicture2();//登录接口@POST("api/login")Observable<ResponseBody> loginApi(@Body RequestBody body);//识别脸部照片@POST("api/ai-face")@MultipartObservable<ResponseBody> uploadFacePhoto2(@Part MultipartBody.Part part, @Part("token") RequestBody token);//识别脸部照片@POST("api/ai-face")@MultipartObservable<FaceBean> uploadFacePhoto(@Part MultipartBody.Part part, @Part("token") RequestBody token);}

人脸识别activity


public class FaceDetectionActivity extends BaseActivity<ActivityFaceDetectionBinding> {private static final int REQUEST_CODE = 10000;//权限private static final int TAKE_PHOTO = 11;// 拍照private static final int LOCAL_CROP = 13;// 本地图库public final String TAG = this.getClass().getSimpleName();String currentFileUrl = "";private FaceAdapter faceAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);faceAdapter = new FaceAdapter(this);//android版本在6.0以上if (Build.VERSION.SDK_INT >= 23) {System.out.println("版本正确");checkPermission();} else {System.out.println("版本过低");}binding.btnChoosePicture.setOnClickListener(view -> getPhoto());binding.btnIdentifyPicture.setOnClickListener(view -> identifyFacePhoto());binding.btnFaceLogout.setOnClickListener(view -> LogoutUser());binding.ivFacepicture.setOnClickListener(view -> getPhoto());}private void LogoutUser() {Hawk.delete("token");Intent intent = new Intent(FaceDetectionActivity.this, LoginActivity.class);startActivity(intent);}//获取人脸照片private void getPhoto() {CharSequence[] items = { "拍照", "图库" };// 裁剪items选项// 弹出对话框提示用户拍照或者是通过本地图库选择图片new AlertDialog.Builder(this).setItems(items, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {switch (which) {// 选择了拍照case 0:Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent, TAKE_PHOTO);break;// 调用系统图库case 1:// 创建Intent,用于打开手机本地图库选择图片Intent intent1 = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);// 启动intent打开本地图库startActivityForResult(intent1, LOCAL_CROP);break;}}}).show();}/*** 调用startActivityForResult方法启动一个intent后,* 可以在该方法中拿到返回的数据*/@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);switch (requestCode) {case TAKE_PHOTO:// 拍照if (resultCode == RESULT_OK) {final Bitmap photo = data.getParcelableExtra("data");//将bitmap照片放入系统相册,并将照片给urlcurrentFileUrl = AppContext.saveImageToGallery(this, photo);binding.ivFacepicture.setImageBitmap(photo);Log.d(TAG, "onActivityResult: " + currentFileUrl);}break;case LOCAL_CROP:// 系统图库if (resultCode == RESULT_OK) {Uri uri = data.getData();binding.ivFacepicture.setImageURI(uri);currentFileUrl = AppContext.getRealPathFromURI(this, uri);Log.d(TAG, "onActivityResult: " + currentFileUrl);}break;}}private void identifyFacePhoto() {if (TextUtils.isEmpty(currentFileUrl)) {AppContext.showToast("请先选择人脸照片");return;} else {binding.progressBar.setVisibility(View.VISIBLE);File file = new File(currentFileUrl);MultipartBody.Part part = MultipartBody.Part.createFormData("image",file.getName(),RequestBody.create(MediaType.parse("image/*"),file));RequestBody body = RequestBody.create(MediaType.parse("text/plain"), "" + Hawk.get("token"));NetworkApi.createService(ApiService.class).uploadFacePhoto2(part, body).compose(NetworkApi.applySchedulers(new BaseObserver<ResponseBody>() {@Override public void onSuccess(ResponseBody responseBody) {String result = AppContext.doJson(responseBody);String face_list = null;FaceBean.ResultBean faceListBean = null;try {JSONObject jsonObject = new JSONObject(result);face_list = jsonObject.getString("result");KLog.d(TAG, face_list);Gson gson = new Gson();faceListBean = gson.fromJson(String.valueOf(new JSONObject(face_list)), FaceBean.ResultBean.class);} catch (JSONException e) {e.printStackTrace();}if (faceListBean != null) {showListFace(faceListBean);// binding.tvIdentifyFaceRusult.setText(AppContext.doJson(responseBody));} else {AppContext.showToast("识别返回接口数据为空");KLog.d(TAG, "识别返回接口数据为空");binding.progressBar.setVisibility(View.GONE);}}@Override public void onFailure(Throwable e) {binding.progressBar.setVisibility(View.GONE);KLog.d(TAG, e.toString());AppContext.showToast("访问失败");}}));}}//测试了一下//展示泪飙private void showListFace(FaceBean.ResultBean faceListBean) {LinearLayoutManager layoutManager = new LinearLayoutManager(this);layoutManager.setOrientation(LinearLayoutManager.VERTICAL);binding.ryFacePeople.setLayoutManager(layoutManager);binding.ryFacePeople.setAdapter(faceAdapter);binding.progressBar.setVisibility(View.GONE);faceAdapter.updateFaceList(faceListBean.getFace_list());}private void checkPermission() {ActivityCompat.requestPermissions(FaceDetectionActivity.this,new String[] { Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE },REQUEST_CODE);}@Overridepublic void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode) {//权限的申请结果返回case REQUEST_CODE: {if (grantResults.length > 0&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {//已授权AppContext.showToast("授权成功");} else {//未授权AppContext.showToast("授权被拒绝");}}}}@Override public void onBackPressed() {super.onBackPressed();finish();}
}

调用百度ai人脸检测接口相关推荐

  1. 微信小程序开发之颜值测试,调用百度AI人脸检测接口

    ​页面效果 插播一下,颜值71,还可以那么狂,哼........ 项目介绍 页面实现上传一张带有人像的图片,点击测试颜值之后返回照片中人像的年龄和颜值,此项目为颜值测试初级,access_token值 ...

  2. 百度AI人脸检测测颜值php,百度AI人脸识别测颜值源码app

    百度AI人脸识别测颜值源码app是由百度AI官方提供的,将人脸识别分为了两个接口,v2与vv3.需要根据文档权限来选择接口类型,这款软件非常方便用户学习和体验.想要学习相关信息的朋友可以来看看哦. 百 ...

  3. 百度AI人脸识别接口调用

    人脸识别作为当下比较潮流的一门技术,已经应用于很多的产品之中了. 今天我们看下百度提供的人脸识别接口如何使用. 1.登录百度智能云平台 首先我们需要登录百度智能云平台,使用百度账号可以直接登录.这个不 ...

  4. 网页控制台调用click()失败_C# 调用百度AI 人脸识别

    一.设置 登录百度云控制台,添加应用-添加人脸识别,查找,对比等. 设置人脸识别应用 记住API Key和Secret Key 二.创建Demo程序 1.使用Nuget安装 Baidu.AI 和 Ne ...

  5. 百度AI人脸检测实现性别、人种肤色、年龄检测python

    元学习论文总结||小样本学习论文总结 2017-2019年计算机视觉顶会文章收录 AAAI2017-2019 CVPR2017-2019 ECCV2018 ICCV2017-2019 ICLR2017 ...

  6. 百度AI人脸识别与检测一:学生人脸识别签到系统简介及百度AI开放平台账号注册和人脸实例应用创建

    <百度AI人脸识别与检测>专栏为项目专栏,从零到一,从无到有开发一个学生人脸识别签到系统:主要用到的技术有百度开放平台中的人脸检测.人脸识别.Python图形界面开发PyQt5.线程的管理 ...

  7. 百度云人脸识别接口+python+opencv做的表情包合成器

    第一次使用python,所以语法有些凌乱. 菜鸟随便做的一个小东西. 开发环境:win10+anaconda3.0+python3.6+opencv2+pyqt5 一.anaconda安装 下载链接: ...

  8. Linux下QT软件使用C++语言调用百度AI接口实现人脸库人脸搜索

    参考文档Qt+百度AI实现人脸识别之人脸检测_画茧自缚-CSDN博客 本文档对于以上文档进行精简,参考以上文档实现百度AI人脸库管理-人脸搜索:百度AI接口一通具通,可以以此方法扩展. .h部分 #i ...

  9. 基于Python的百度AI人脸识别API接口(可用于OpenCV-Python人脸识别)

    基于Python的百度AI人脸识别API接口(可用于OpenCV-Python人脸识别) 资源: download.csdn.net/download/weixin_53403301/43644312 ...

最新文章

  1. 沉默是金 矩阵快速幂
  2. 此beta版本目前不接受任何新测试员_ASO行业资讯|苹果官方App测试工具TestFlight
  3. avr计数_使用8位LCD创建计数器| AVR
  4. python模拟登记获取cookie_Python爬虫实战入门四:使用Cookie模拟登录——获取电子书下载链接...
  5. 唤醒屏幕_小度在家VS天猫精灵CC 屏幕正在让智能音箱进入下一版本
  6. 玩转 SpringBoot 2 之发送邮件篇
  7. FLEX- MDI窗口开发实例
  8. 【CCCC】L2-018 多项式A除以B (25分),多项式除法
  9. CentOS_5.5_安装GCC编译LiME
  10. 疯狂kotlin讲义连载之流程控制——顺序结构与分支结构 二
  11. 期待人工智能在合作时的表现
  12. 计算机基础(一):二进制详解
  13. 2光16电全千兆二层管理型宽温工业级环网交换机 光纤自愈环网工业级以太网交换机
  14. Java Web学习(1)
  15. 实验3-11 求一元二次方程的根
  16. 网页播放器自定义倍速播放
  17. 软件工程毕业论文mysql英文翻译_软件工程专业毕业设计外文文献翻译
  18. C++ Lua库 源码编译及使用(VS2019)
  19. Hadoop安装与部署
  20. STM32 Simulink 自动代码生成电机控制:基于反电动势观测器的锁相环设计

热门文章

  1. 马云:不吃苦,你要青春干嘛?
  2. Funpack第六期-基于MAX32660-EVSYS具有心率和血氧检测智能手环
  3. BI 系统中为什么会有很多快照表?
  4. 【火车高铁12306】改签/退票/变更到站的规定详解
  5. 拯救pandas计划(16)——将DataFrame的奇偶列位置进行前后对调
  6. 将16bit的数据高低位对调的方式
  7. 特斯拉砍掉挡杆,自动驾驶已经开始改变人类?
  8. ipad和iphone适配_如何在iPhone和iPad上禁用Siri
  9. 实验十五 摩尔状态机序列检测器“1101”
  10. 绘制网格、主对角线格子填充、拷贝图像、wait_for_button循环。