안 드 로 이 드 는 얼굴++패 키 지 를 사용 하여 얼굴 인식 을 실현 한다.

전재 에 오신 것 을 환영 합 니 다.전재 할 때 출처 를 표시 해 주 십시오.http://blog.csdn.net/android_for_james/article/details/51016170
오늘 은 페 이 스++를 통 해 얼굴 인식 을 할 수 있 는 기능 을 보 여 드 리 겠 습 니 다.
우리 먼저 이 페 이 스+홈 페이지 에 가 보 자.http://www.faceplusplus.com.cn
저희 가 사례 를 클릭 하면 저희 가 잘 아 는 소프트웨어 가 이 회사 에서 제공 하 는 SDK 를 많이 볼 수 있 습 니 다.

그리고 저 희 는 개발 자 센터 의 개발 도구 와 sdk 를 클릭 하여 저희 가 필요 로 하 는 sdk 를 다운로드 합 니 다.
그 다음 에 제 애플 리 케 이 션 의 생 성 애플 리 케 이 션 을 클릭 하면 키 두 개 를 주 실 거 예요.
이 두 값 을 저장 하려 면 프로그램 에서 사용 해 야 합 니 다.
제 가 오늘 이 루 는 건 얼굴 캡 처 를 하고 성별 과 나 이 를 식별 하 는 거 예요.효과 도 를 볼 게 요.
Android使用Face++架构包实现人脸识别_第1张图片
Android使用Face++架构包实现人脸识别_第2张图片
Android使用Face++架构包实现人脸识别_第3张图片
Android使用Face++架构包实现人脸识别_第4张图片
잡담 은 그만 하고 실현 을 보 자.
1.도구 류 Constant 는 키 를 저장 하 는 데 사 용 됩 니 다.
public class Constant {
     //             
     public static final String Key="2029451928755e97039b8138cfa8f8ca";
     public static final String Secret="5RNoYATB9vqpA5kerpmo6bp2Aw9fxMl0";
}

2.
도구 클래스 Internet Detect
import android.graphics.Bitmap;

import com.facepp.error.FaceppParseException;
import com.facepp.http.HttpRequests;
import com.facepp.http.PostParameters;

import org.json.JSONObject;

import java.io.ByteArrayOutputStream;

public class InternetDetect {
    public interface CallBack
    {
        void success(JSONObject jsonObject);

        void error(FaceppParseException exception);

    }
    public static void dectect(final Bitmap bitmap, final CallBack callBack)
    {
        //                           
        new Thread(new Runnable() {
            @Override
            public void run() {
                /*1.    
                * 2.    Bitmap
                * 3.       
                * 4. bitmap          
                * 5.         
                * 6.       
                * 7.       
                *
                * */
                try {

                    HttpRequests httpRequests=new HttpRequests(Constant.Key,Constant.Secret,true,true);
                    // 0,0       ,          
                    Bitmap bitmapsmall = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight());
                    //  api            ,           
                    ByteArrayOutputStream stream=new ByteArrayOutputStream();
                    /*Bitmap.compress()       Bitmap-->byte[]
                                 OutputStream。    true,
                                   InputStream BitmapFactory.decodeStream(  )
                              JPEG PNG  ,          ,           */
                    bitmapsmall.compress(Bitmap.CompressFormat.JPEG, 100, stream);
                    byte[] arrays=stream.toByteArray();
                    //        
                    PostParameters parameters=new PostParameters();
                    //    
                    parameters.setImg(arrays);
                    //       JSONObject   
                    JSONObject jsonObject=httpRequests.detectionDetect(parameters);
                    System.out.println("jsonObject:"+jsonObject.toString());
                    if(callBack!=null)
                    {
                        //    
                        callBack.success(jsonObject);
                    }
                } catch (FaceppParseException e) {

                    System.out.println("error");
                    e.printStackTrace();
                    if(callBack!=null)
                    {
                        callBack.error(e);
                    }
                }


            }
        }).start();
    }

}

3.MainActivity
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.MediaStore;
import android.support.v7.app.ActionBarActivity;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.facepp.error.FaceppParseException;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class MainActivity extends ActionBarActivity implements View.OnClickListener {
    private static final int PICK_CODE =1;
    private ImageView myPhoto;
    private Button getImage;
    private Button detect;
    private TextView tip;
    private View mWaitting;
    private String ImagePath=null;
    private Paint mypaint;
    private Bitmap myBitmapImage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mypaint=new Paint();
        initViews();
        initEvent();
    }
    private void initViews()
    {
        myPhoto=(ImageView)findViewById(R.id.id_photo);
        getImage=(Button)findViewById(R.id.get_image);
        detect=(Button)findViewById(R.id.detect);
        tip=(TextView)findViewById(R.id.id_Tip);
        mWaitting=findViewById(R.id.id_waitting);
        tip.setMovementMethod(ScrollingMovementMethod.getInstance());

    }
    private void initEvent()
    {
        getImage.setOnClickListener(this);
        detect.setOnClickListener(this);
    }
    @Override
    public void onClick(View v) {

        switch (v.getId())
        {
            case R.id.get_image:
                //        intent
                Intent intent=new Intent(Intent.ACTION_PICK);
                intent.setType("image/*");
                //            PICK_CODE
                startActivityForResult(intent,PICK_CODE);
                break;
            case R.id.detect:
                //       
                mWaitting.setVisibility(View.VISIBLE);
                //                       detect  
                //                  
                if(ImagePath!=null&&!ImagePath.trim().equals(""))
                {
                    //                     
                    resizePhoto();
                }else
                {
                    //           bitmap  
                    myBitmapImage=BitmapFactory.decodeResource(getResources(),R.drawable.test1);
                }
                //    
                InternetDetect.dectect(myBitmapImage, new InternetDetect.CallBack() {
                    @Override
                    public void success(JSONObject jsonObject) {
                        Message message=Message.obtain();
                        message.what=MSG_SUCESS;
                        message.obj=jsonObject;
                        myhandler.sendMessage(message);
                    }
                    @Override
                    public void error(FaceppParseException exception) {
                        Message message=Message.obtain();
                        message.what=MSG_ERROR;
                        message.obj=exception;
                        myhandler.sendMessage(message);
                    }
                });
                break;
        }

    }
    //    intent  
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        super.onActivityResult(requestCode, resultCode, intent);
        if(requestCode==PICK_CODE)
        {
            if(intent!=null)
            {
                //      
                //        
                Uri uri=intent.getData();
                //        ContentResolver   
                Cursor cursor=getContentResolver().query(uri,null,null,null,null);
                cursor.moveToFirst();
                //       
                int index=cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
                //       
                ImagePath=cursor.getString(index);
                cursor.close();
                //  jar              3m             
                resizePhoto();
                myPhoto.setImageBitmap(myBitmapImage);
                tip.setText("Click Detect==>");
            }
        }
    }

    private void resizePhoto() {
        //  BitmapFactory    
        BitmapFactory.Options options = new BitmapFactory.Options();
        //       true ,     ,     ,            。
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(ImagePath,options);
        //          1024
        double ratio=Math.max(options.outWidth*1.0d/1024f,options.outHeight*1.0d/1024f);
        //         。     4 ,          1/4 ,       1/16 。
        options.inSampleSize=(int)Math.ceil(ratio);
        //                   false
        options.inJustDecodeBounds=false;
        //  Options                 。
        myBitmapImage=BitmapFactory.decodeFile(ImagePath,options);
    }

    private static final int MSG_SUCESS=11;
    private static final int MSG_ERROR=22;
    private Handler myhandler=new Handler()
    {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what)
            {
                case MSG_SUCESS:
                    //     
                    mWaitting.setVisibility(View.GONE);
                    //         JSONObject  
                    JSONObject rsobj= (JSONObject) msg.obj;
                    //  Bitmap,     JSONObject     
                    prepareBitmap(rsobj);
                    //         
                    myPhoto.setImageBitmap(myBitmapImage);
                    break;
                case MSG_ERROR:
                    mWaitting.setVisibility(View.GONE);
                    String errormsg= (String) msg.obj;
                    break;
            }
        }


    };

    private void prepareBitmap(JSONObject JS) {
        //    Bitmap     Canvas     
        Bitmap bitmap=Bitmap.createBitmap(myBitmapImage.getWidth(),myBitmapImage.getHeight(),myBitmapImage.getConfig());
        //       
        Canvas canvas=new Canvas(bitmap);
        //          
        canvas.drawBitmap(myBitmapImage, 0, 0, null);
        //     JSONObject  
        try {
                //JSONObject      JSONArray,            face       
                JSONArray faces=JS.getJSONArray("face");
                //        
                int faceCount=faces.length();
                //          
                tip.setText("find"+faceCount);
               //                  
                for(int i=0;i<faceCount;i++)
                {
                    //         
                    JSONObject face=faces.getJSONObject(i);
                    //           
                    JSONObject position=face.getJSONObject("position");
                    float x=(float)position.getJSONObject("center").getDouble("x");
                    float y=(float)position.getJSONObject("center").getDouble("y");
                    float w=(float)position.getDouble("width");
                    float h=(float)position.getDouble("height");
                    //                    ,      ,                
                    //                  
                    x=x/100*bitmap.getWidth();
                    y=y/100*bitmap.getHeight();
                    w=w/100*bitmap.getWidth();
                    h=h/100*bitmap.getHeight();
                    //      
                    mypaint.setColor(0xffffffff);
                    //      
                    mypaint.setStrokeWidth(3);
                    //       
                    canvas.drawLine(x-w/2,y-h/2,x-w/2,y+h/2,mypaint);
                    canvas.drawLine(x-w/2,y-h/2,x+w/2,y-h/2,mypaint);
                    canvas.drawLine(x+w/2,y-h/2,x+w/2,y+h/2,mypaint);
                    canvas.drawLine(x-w/2,y+h/2,x+w/2,y+h/2,mypaint);
                    //      
                    int age=face.getJSONObject("attribute").getJSONObject("age").getInt("value");
                    //      
                    String gender=face.getJSONObject("attribute").getJSONObject("gender").getString("value");
                    System.out.println("age:"+age);
                    System.out.println("gender:"+gender);
                    //                    ,             
                    Bitmap ageBitmap=buildAgeBitmap(age,("Male").equals(gender));
                    //           ,      ,                    
                    int agewidth=ageBitmap.getWidth();
                    int agehight=ageBitmap.getHeight();
                    if(bitmap.getWidth()<myPhoto.getWidth()&&bitmap.getHeight()<myPhoto.getHeight())
                    {
                        //     
                        float ratio=Math.max(bitmap.getWidth()*1.0f/
                                myPhoto.getWidth(),bitmap.getHeight()*1.0f/myPhoto.getHeight());

                        //    
                        ageBitmap=Bitmap.createScaledBitmap(ageBitmap,(int)(agewidth*ratio*0.8),(int)(agehight*ratio*0.5),false);
                    }
                    //          
                    canvas.drawBitmap(ageBitmap,x-ageBitmap.getWidth()/2,y-h/2-ageBitmap.getHeight(),null);
                    //    bitmap
                    myBitmapImage=bitmap;
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

    private Bitmap buildAgeBitmap(int age, boolean isMale) {
        //               ,   Canvas          
        //         ,          TextView,           
        //                   
        TextView tv= (TextView) mWaitting.findViewById(R.id.id_age_and_gender);
        //                   ""           
        tv.setText(age + "");
        if(isMale)
        {
            //    
            tv.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.male),null,null,null);

        }else
        {
            tv.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(R.drawable.female),null,null,null);
        }

        //  setDrawingCacheEnabled(boolean flag)      
        //View           cache     bitmap
        //       cache    setDrawingCacheEnable   cache  ,
        //      getDrawingCache        view cache   。
        tv.setDrawingCacheEnabled(true);
        Bitmap bitmap=Bitmap.createBitmap(tv.getDrawingCache());
        //    
        tv.destroyDrawingCache();
        return bitmap;
    }


}
레이아웃 파일 이 쉬 워 서 코드 는 올 리 지 않 겠 습 니 다.
여기 서 제 가 실현 하 는 과정 에서 겪 은 문 제 를 빨간색 글씨체 로 표시 하 겠 습 니 다.피하 시기 바 랍 니 다.
1.버튼 응답 을 쓸 때 사용자 가 그림 을 선택 하지 않 고 detect 단 추 를 눌 렀 는 지 판단 해 야 합 니 다.그러면 그림 을 가 져 올 때 빈 포인터 이상 이 있 는 문 제 를 피 할 수 있 습 니 다.
2.사진 을 업로드 할 때 는 그림 이 3M 보다 작 아야 하기 때문에 그림 의 압축 에 주의해 야 한다.
3.기포 처리 기술 이 있어 Textview 로 사용 하 는 것 이 편리 하 다
4.기 포 를 그 릴 때 도 크기 조정 에 주의해 야 한다.그렇지 않 으 면 얼굴 이 작 을 때 기포 가 전체 그림 을 차지 하여 사용자 체험 이 떨어진다.
여러분 에 게 도움 이 되 기 를 바 랍 니 다.전 재 를 환영 하지만 출처 를 표시 해 주 십시오.감사합니다!
부족 한 점 이 있 으 면 댓 글로 남 겨 주세요.빨리 답 하고 고 치 겠 습 니 다!
나의 블 로그 에 관심 을 가 져 주 십시오:http://blog.csdn.net/android_for_james

좋은 웹페이지 즐겨찾기