人脸识别1:1对比 (二)

摘要:
paddingBottom=“@dimen/activity_vertical_margin”8android:src=“@drawable/head”/&gt:textSize=“20dp”/&gt:布局_宽度=“0dp”42android:layout_高度=“180dp”43android:src:“@dravable/head

本项目采用Face++第三方接口,项目实现了两张图片的人脸识别和对比,得到相似度等信息

项目步骤如下:

一、所需权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

二、第三方app id app key

项目采用了Face++第三方接口,可自行注册获取

三、添加依赖和sdk

人脸识别1:1对比 (二)第1张

1. 将FaceppSDK.jar文件放到libs路径下。

2. gradle中添加一下依赖:

compile files('libs/FaceppSDK.jar')

四、布局文件

  

人脸识别1:1对比 (二)第2张

Face++ 1:1对比

页面两个ImageView 点击选择本地图片,button点击比对,比对结果在下方TextView 展示

人脸识别1:1对比 (二)第3张人脸识别1:1对比 (二)第4张
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <ScrollView
 3     xmlns:android="http://schemas.android.com/apk/res/android"
 4     xmlns:tools="http://schemas.android.com/tools"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     android:paddingBottom="@dimen/activity_vertical_margin"
 8     android:paddingLeft="@dimen/activity_horizontal_margin"
 9     android:paddingRight="@dimen/activity_horizontal_margin"
10     android:paddingTop="@dimen/activity_vertical_margin"
11     tools:context="com.example.lifen.facecomparedemo.MainActivity">
12 
13     <LinearLayout
14         android:layout_width="match_parent"
15         android:layout_height="match_parent"
16         android:orientation="vertical">
17 
18         <LinearLayout
19             android:layout_width="match_parent"
20             android:layout_height="wrap_content"
21             android:orientation="horizontal">
22 
23             <ImageView
24                 android:id="@+id/img1"
25                 android:layout_width="0dp"
26                 android:layout_height="180dp"
27                 android:layout_weight="1"
28                 android:scaleType="centerCrop"
29                 android:src="@drawable/head"/>
30 
31             <TextView
32                 android:layout_width="wrap_content"
33                 android:layout_height="match_parent"
34                 android:gravity="center"
35                 android:text="VS"
36                 android:textColor="@android:color/black"
37                 android:textSize="20dp"/>
38 
39             <ImageView
40                 android:id="@+id/img2"
41                 android:layout_width="0dp"
42                 android:layout_height="180dp"
43                 android:layout_weight="1"
44                 android:scaleType="centerCrop"
45                 android:src="@drawable/head"/>
46 
47         </LinearLayout>
48 
49         <Button
50             android:id="@+id/compareBtn"
51             android:layout_width="match_parent"
52             android:layout_height="wrap_content"
53             android:layout_marginTop="@dimen/activity_horizontal_margin"
54             android:text="比对"/>
55 
56         <TextView
57             android:id="@+id/resultBtn"
58             android:layout_width="match_parent"
59             android:layout_height="wrap_content"
60             android:layout_marginTop="@dimen/activity_horizontal_margin"
61             android:background="#eeeeee"
62             android:padding="6dp"/>
63 
64     </LinearLayout>
65 </ScrollView>
View Code

五、页面 activity

人脸识别1:1对比 (二)第3张人脸识别1:1对比 (二)第6张
  1 package com.example.lifen.facecomparedemo;
  2 
  3 import android.content.ContentResolver;
  4 import android.content.Intent;
  5 import android.graphics.Bitmap;
  6 import android.graphics.BitmapFactory;
  7 import android.net.Uri;
  8 import android.os.Bundle;
  9 import android.os.Handler;
 10 import android.os.Message;
 11 import android.support.v7.app.AlertDialog;
 12 import android.support.v7.app.AppCompatActivity;
 13 import android.text.TextUtils;
 14 import android.util.Base64;
 15 import android.util.Log;
 16 import android.view.View;
 17 import android.widget.Button;
 18 import android.widget.ImageView;
 19 import android.widget.TextView;
 20 import android.widget.Toast;
 21 
 22 import com.megvii.cloud.http.CommonOperate;
 23 import com.megvii.cloud.http.Response;
 24 
 25 import java.io.ByteArrayOutputStream;
 26 import java.io.FileNotFoundException;
 27 
 28 /**
 29  * 人脸对比 1:1
 30  *
 31  * @author LiFen
 32  */
 33 public class MainActivity extends AppCompatActivity {
 34     private static final String TAG = "MainActivity";
 35     private static final int REQUEST_CODE1 = 11;
 36     private static final int REQUEST_CODE2 = 12;
 37     ImageView mImageView1;
 38     ImageView mImageView2;
 39     Button mCompareBtn;
 40     TextView mResultText;
 41     private String mImgBase641;
 42     private String mImgBase642;
 43     String key = "";//api_key
 44     String secret = "";//api_secret
 45     private final static int i = 100;
 46     private Handler handler = new Handler(){
 47         @Override
 48         public void handleMessage(Message msg) {
 49             if(msg.what == i){
 50                 mResultText.setText((String)msg.obj);
 51             }
 52         }
 53     };
 54     @Override
 55     protected void onCreate(Bundle savedInstanceState) {
 56         super.onCreate(savedInstanceState);
 57         setContentView(R.layout.activity_main);
 58 
 59         mImageView1 = (ImageView) findViewById(R.id.img1);
 60         mImageView2 = (ImageView) findViewById(R.id.img2);
 61         mCompareBtn = (Button) findViewById(R.id.compareBtn);
 62         mResultText = (TextView) findViewById(R.id.resultBtn);
 63         if(TextUtils.isEmpty(key) || TextUtils.isEmpty(secret)){
 64             AlertDialog.Builder builder = new AlertDialog.Builder(this);
 65             builder.setMessage("please enter key and secret");
 66             builder.setTitle("");
 67             builder.show();
 68             return;
 69         }
 70         mImageView1.setOnClickListener(new View.OnClickListener() {
 71             @Override
 72             public void onClick(View v) {
 73                 startAlbumActivity(REQUEST_CODE1);
 74             }
 75         });
 76         mImageView2.setOnClickListener(new View.OnClickListener() {
 77             @Override
 78             public void onClick(View v) {
 79                 startAlbumActivity(REQUEST_CODE2);
 80             }
 81         });
 82         mCompareBtn.setOnClickListener(new View.OnClickListener() {
 83             @Override
 84             public void onClick(View v) {
 85                 startCompare();
 86             }
 87         });
 88     }
 89 
 90     private void startCompare() {
 91         if ("".equals(mImgBase641) || mImgBase641 == null || "".equals(mImgBase642) || mImgBase642 == null) {
 92             Toast.makeText(this, "请选择图片再比对", Toast.LENGTH_SHORT).show();
 93             return;
 94         }
 95         mResultText.setText("比对中...");
 96         new Thread(new Runnable() {
 97             @Override
 98             public void run() {
 99                 Log.i(TAG, "run() called");
100                 CommonOperate commonOperate = new CommonOperate(key, secret, false);
101                 try{
102                     Response compare = commonOperate.compare(null, null, null, mImgBase641,
103                             null, null, null, mImgBase642);
104                     String res = new String(compare.getContent());
105                     Message msg = new Message();
106                     msg.what = i;
107                     msg.obj = res;
108                     handler.sendMessage(msg);
109                 }catch (Exception e){
110                     Log.i(TAG, "startCompare: " +e.toString());
111                 }
112             }
113         }).start();
114     }
115 
116     private void startAlbumActivity(int requestCode) {
117         Intent intent = new Intent();
118         intent.setType("image/*");
119         intent.setAction(Intent.ACTION_GET_CONTENT);
120         startActivityForResult(intent, requestCode);
121     }
122 
123     @Override
124     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
125         if (data == null)
126             return;
127         Uri uri = data.getData();
128         Log.e("uri", uri.toString());
129         ContentResolver cr = this.getContentResolver();
130         Bitmap bitmap = null;
131         try {
132             bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
133                 /* 将Bitmap设定到ImageView */
134         } catch (FileNotFoundException e) {
135             Log.e("Exception", e.getMessage(), e);
136         }
137         if (resultCode == RESULT_OK && requestCode == REQUEST_CODE1) {
138             mImageView1.setImageBitmap(bitmap);
139             mImgBase641 = bitmapToBase64(bitmap);
140         } else if (resultCode == RESULT_OK && requestCode == REQUEST_CODE2) {
141             mImageView2.setImageBitmap(bitmap);
142             mImgBase642 = bitmapToBase64(bitmap);
143         }
144         super.onActivityResult(requestCode, resultCode, data);
145     }
146 
147     private String bitmapToBase64(Bitmap bitmap) {
148         ByteArrayOutputStream bStream = new ByteArrayOutputStream();
149         bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bStream);
150         return Base64.encodeToString(bStream.toByteArray(), 0);
151     }
152 }
View Code

代码中

key 和 secret 请自行注册,填入

项目源码地址:https://download.csdn.net/download/qq_36726507/10290076

免责声明:文章转载自《人脸识别1:1对比 (二)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jsp里的逻辑语句c:if和c:choose前端工程打开速度优化的循序渐进总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

用PopupWindow实现弹出菜单(弹出的菜单采用自定义布局)

     用PopupWindow实现弹出菜单是一个比较好的方式。当然我们还有一个类PopupMenu也能实现弹出菜单,但那个太过于局限了,所以不是很推荐。 这个实例的效果是这样的:点击按钮后,一个菜单从屏幕的右边滑入到屏幕中,点击按钮/空白处后菜单消失。 布局文件时一个按钮,我就不贴出代码了。下面是菜单的布局: <?xml version="1.0...

Android 5.0 以上监听网络变化

大家好,大概有一个多月没有更新博客了,我是干什么去了呢?很明显,程序员当然要加班……这一次跟大家分享一下新项目的一些心得。 监听网络变化在开发中是经常用到的,例如我们断网有一些友好的提示,或者根据不同的网络更改一些加载策略,例如wifi看视频,非wifi则会有一个提示,还有极个别更恶心的偷摸的在后台给你下各种安装包,是谁我就不一一列举了。 在5.0以前,我...

打印全排列

打印出一个字符串的全排列,有很多方法,最容易看到的是递归的方法。 void range(char a[], int k){ if(k==a.length-1){ System.out.println(Arrays.toString(a)); } else { for(int i=k;i<a.length;i++){ swap(a[i],a[k]);...

Android程序报错以及解决办法

INSTALL_FAILED_OLDER_SDK Launching ‘app’ on Genymotion Google Nexus 5. Installation did not succeed. The application could not be installed: INSTALL_FAILED_OLDER_SDK The applicat...

微信小程序循环中点击一个元素,其他的元素不发生变化,类似点击一个循环中的语音,其他的不发生点击事件

类似语音,因为都在一个数据内,所以点击第一个,所有的语音都变化,解决方法就是 把整个数据都获取下来,然后更改其中一个需要更改的值,然后再把整个数据都setdata回去,如果需要动画的话,wxml里面放两个组件,一个默认,点击时候隐藏,把另一个显示出来。   例如点击第一个语音,想要播放http://voluntarybanktestapi.wxstar.c...

android:duplicateParentState属性

xml文件 <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:la...