zoukankan      html  css  js  c++  java
  • 人脸识别1:1对比 (二)

    本项目采用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. 将FaceppSDK.jar文件放到libs路径下。

    2. gradle中添加一下依赖:

    compile files('libs/FaceppSDK.jar')

    四、布局文件

      

    Face++ 1:1对比

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

     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 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

  • 相关阅读:
    java中的锁
    CAS机制与自旋锁
    volatile关键字的特性及证明
    java中并发下的集合类
    数据库的分库分表
    浅入理解JVM
    99乘法表
    JAVA实现简单的时间刷新使用线程
    线程的优先级
    线程礼让
  • 原文地址:https://www.cnblogs.com/jxust-jiege666/p/8580010.html
Copyright © 2011-2022 走看看