使用face++做人臉,年齡,性別識別
阿新 • • 發佈:2019-02-12
package com.example.administrator.testdemo.face; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.drawable.Drawable; import com.example.administrator.testdemo.bean.FaceMessage; importjava.util.List; /** * Created by Administrator on 2017/8/16. */ public class BitmapCanvas { private Bitmap bitmap; private List<FaceMessage> messageList; public Bitmap getBitmap() { return bitmap; } public void setBitmap(Bitmap bitmap) { this.bitmap = bitmap; } publicBitmapCanvas(Bitmap bitmap) { this.bitmap = bitmap; } public List<FaceMessage> getMessageList() { return messageList; } public void setMessageList(List<FaceMessage> messageList,CanvasFinish c) { this.messageList = messageList; draw(c); } public voiddraw(CanvasFinish c){ if (messageList!=null){ Canvas canvas =new Canvas(bitmap); // canvas.drawRect(getRectF(),getpaint()); for (int i = 0; i <messageList.size() ; i++) { canvas.drawRect(messageList.get(i).getRectF(),getpaint()); canvas.drawText(messageList.get(i).getGender()+"年齡"+messageList.get(i).getAge(),messageList.get(i).getPoint().x,messageList.get(i).getPoint().y,textPaint()); } c.canvasfinish(); } } private Paint getpaint(){ Paint paint =new Paint(); paint.setColor(Color.RED); paint.setAntiAlias(true); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(5f); return paint; } private Paint textPaint(){ Paint paint =new Paint(); paint.setColor(Color.BLUE); paint.setTextSize(40f); return paint; } }
public interface CanvasFinish { void canvasfinish(); }
package com.example.administrator.testdemo.bean; import android.graphics.Point; import android.graphics.PointF; import android.graphics.RectF; import java.util.List; /** * Created by Administrator on 2017/8/15. */ public class FaceMessage { private String gender; private int age; private RectF rectF; public String getGender() { return gender; } public void setGender(String gender) { this.gender=gender.equals("Male")?"男":"女"; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public RectF getRectF() { return rectF; } public void setRectF(RectF rectF) { this.rectF = rectF; } public void setRectF(int size,int top,int left) { this.rectF=new RectF(left,top,left+size,top+size); } public PointF getPoint(){ if (rectF!=null){ PointF point =new PointF(rectF.left,rectF.top); return point; } return null; } }
package com.example.administrator.testdemo.face; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Environment; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.text.TextUtils; import android.util.Base64; import android.util.Log; import android.widget.ImageView; import android.widget.TextView; import com.android.volley.RequestQueue; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import com.example.administrator.testdemo.Log.LogShow; import com.example.administrator.testdemo.R; import com.example.administrator.testdemo.bean.FaceMessage; import com.megvii.cloud.http.CommonOperate; import com.megvii.cloud.http.FaceSetOperate; import com.megvii.cloud.http.Response; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; public class MainActivity extends AppCompatActivity { TextView mTextView; String key = "aRKh7sDhT536YLHORdXOFFBqJOeF5Gzv";//api_key String secret = "zrfIe28avDUP4z36mEy9vg2csDXszxB8";//api_secret String imageUrl = "http://pic1.hebei.com.cn/003/005/869/00300586905_449eedbb.jpg"; StringBuffer sb = new StringBuffer(); long start=System.currentTimeMillis(); private File file; private ImageView img; private Bitmap bitmap; private BitmapCanvas bitmacanvas; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mains); img= (ImageView) findViewById(R.id.img); bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.timg3).copy(Bitmap.Config.RGB_565,true); bitmacanvas=new BitmapCanvas(bitmap); LogShow.logShow(bitmap.getWidth()); LogShow.logShow(bitmap.getHeight()); LogShow.logShow("==========================================="); img.setImageBitmap(bitmap); new Thread(new Runnable() { @Override public void run() { post(); } }).start(); } public void post(){ // bitmacanvas.draw(); ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG,100,byteArrayOutputStream); bytes = byteArrayOutputStream.toByteArray(); if (bytes.length>0){ start=System.currentTimeMillis(); handler.sendEmptyMessage(0); } } private byte[] bytes; private Handler handler =new Handler(Looper.getMainLooper()){ @Override public void handleMessage(Message msg) { if (msg.what==2){ img.setImageBitmap(bitmap); return; } new Thread(new Runnable() { @Override public void run() { // ArrayList<String> faces = new ArrayList<>(); CommonOperate commonOperate = new CommonOperate(key, secret, false); try { Response response1 = commonOperate.detectByte(bytes, 0, "gender,age"); if (getFaceToken(response1)){ bitmacanvas.setMessageList(facemessages, new CanvasFinish() { @Override public void canvasfinish() { handler.sendEmptyMessage(2); } }); } } catch (Exception e) { e.printStackTrace(); } } }).start(); } }; private boolean getFaceToken(Response response) throws JSONException { if(response.getStatus() != 200){ return false; } String res = new String(response.getContent()); jsonParse(res); return true; } private List<FaceMessage> facemessages; private void jsonParse(String value){ if (facemessages==null){ facemessages=new ArrayList<>(); }else { facemessages.clear(); } try { JSONObject jsonObject =new JSONObject(value); JSONArray faces = jsonObject.getJSONArray("faces"); for (int i = 0; i <faces.length() ; i++) { LogShow.logShow(faces.get(i).toString()); FaceMessage faceonew=new FaceMessage(); faceonew.setGender( faces.getJSONObject(i).getJSONObject("attributes").getJSONObject("gender").getString("value")); faceonew.setAge(faces.getJSONObject(i).getJSONObject("attributes").getJSONObject("age").getInt("value")); int size=faces.getJSONObject(i).getJSONObject("face_rectangle").getInt("width"); int top= faces.getJSONObject(i).getJSONObject("face_rectangle").getInt("top"); int left= faces.getJSONObject(i).getJSONObject("face_rectangle").getInt("left"); faceonew.setRectF(size,top,left); facemessages.add(faceonew); } } catch (JSONException e) { e.printStackTrace(); } } @Override protected void onDestroy() { super.onDestroy(); if (bitmap!=null){ bitmap.recycle(); } } }