zoukankan      html  css  js  c++  java
  • Android 人脸识别

    Android人脸识别技术,可以参考下面的网站。
    http://www.faceplusplus.com.cn/
    本项目使用的就是该网站的api.

    项目具体使用的技术代码

    /**
         * 用来压缩图片的方法
         */
        private void resizePhoto() {
            BitmapFactory.Options options = new Options();
            options.inJustDecodeBounds = true;
    
            BitmapFactory.decodeFile(mcurrentPhotoPath, options);
    
            double ratio = Math.max(options.outWidth*1.0d/1024 , options.outHeight*1.0d/1024);
    
            options.inSampleSize = (int)Math.ceil(ratio);
    
            options.inJustDecodeBounds = false;
    
            mphotoImage = BitmapFactory.decodeFile(mcurrentPhotoPath, options);
        }
    //开启图库
    Intent intent = new Intent(Intent.ACTION_PICK);
                    intent.setType("image/*");
                    startActivityForResult(intent, PIC_CODE);
    得到图片位置
    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
            switch(requestCode) {
            //获取图片的路径
                case PIC_CODE:
                    if(null != intent) {
                        Uri uri = intent.getData();
                        Cursor cursor = getContentResolver().query( uri, null, null, null, null);
                        if (cursor==null) {
                            Log.e("M", "null");
                        }
                        cursor.moveToFirst();
    
                        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
                        mcurrentPhotoPath = cursor.getString(idx);
                        cursor.close();
    
                        resizePhoto();
    
                        photoView.setImageBitmap(mphotoImage);
                        num_detected.setText("");
                    }
                    break;

    不装逼了,贴代码。
    Mainactivity.class

    package com.crazylin.facedetected;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.BitmapFactory.Options;
    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.text.TextUtils;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.Window;
    import android.view.WindowManager;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import com.facepp.error.FaceppParseException;
    
    public class MainActivity extends Activity implements OnClickListener {
        private static final int PIC_CODE = 0X110;
        private Button getImage_btn, image_detect_btn, capture_btn;
        private View loadingView;
        private ImageView photoView;
        private TextView num_detected;
        private String mcurrentPhotoPath;
        private Bitmap mphotoImage;
        private Handler mhandler;
        private Paint mPaint;
        private TextView infoText;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                        WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏
            setContentView(R.layout.activity_main);
    
            initView();
            initEvent();
    
            initHandler();
            mPaint = new Paint();
    
        }
    
        private void initHandler() {
            mhandler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    switch(msg.what) {
                        case RESULT_OK:
                            loadingView.setVisibility(View.GONE);
                            JSONObject json = (JSONObject) msg.obj;
                            prepareResultBitmap(json);
                            photoView.setImageBitmap(mphotoImage);
                            break;
                        case RESULT_CANCELED:
                            loadingView.setVisibility(View.GONE);
                            String errorMessage = (String) msg.obj;
    
                            if(TextUtils.isEmpty(errorMessage)) {
                                num_detected.setText("Error");
                            }else {
                                num_detected.setText(errorMessage);
                            }
                            break;
                    }
                }
    
    
            };
        }
    
        private void prepareResultBitmap(JSONObject json) {
            Bitmap bitmap = Bitmap.createBitmap(mphotoImage.getWidth(), mphotoImage.getHeight(), mphotoImage.getConfig());
            Canvas canvas = new Canvas(bitmap);
            canvas.drawBitmap(mphotoImage, 0, 0, null);
            try {
                JSONArray faces = json.getJSONArray("face");
                int faceCount = faces.length();
                num_detected.setText("find : " + faceCount);
    
                for(int i=0; i<faceCount; i++) {
                    //单独的face对象
                    JSONObject face = faces.getJSONObject(i);
    
                    int age = face.getJSONObject("attribute").getJSONObject("age").getInt("value");
                    String gender = face.getJSONObject("attribute").getJSONObject("gender").getString("value");
                    //String race = face.getJSONObject("attribute").getJSONObject("race").getString("value");
    
                    Bitmap infoBitmap = BuildBitmapInfo(age, gender);
    
                    int infoWidth = infoBitmap.getWidth();
                    int infoHeight = infoBitmap.getHeight();
    
                    if((bitmap.getWidth() < photoView.getWidth())&&(bitmap.getHeight() < photoView.getHeight())) {
                        float ratio = Math.max(bitmap.getWidth()*1.0f/photoView.getWidth(), bitmap.getHeight()*1.0f/photoView.getHeight());
                        infoBitmap = Bitmap.createScaledBitmap(infoBitmap, (int)(infoWidth * ratio), (int)(infoHeight * ratio), false);
                    }
    
    
                    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();
    
                    mPaint.setColor(0xffffffff);
                    canvas.drawLine(x - w/2, y - h/2, x - w/2, y + h/2, mPaint);
                    canvas.drawLine(x - w/2, y - h/2, x + w/2, y - h/2, mPaint);
                    canvas.drawLine(x + w/2, y - h/2, x + w/2, y + h/2, mPaint);
                    canvas.drawLine(x - w/2, y + h/2, x + w/2, y + h/2, mPaint);
    
                    canvas.drawBitmap(infoBitmap, x - infoBitmap.getWidth()/2, y - h/2 - infoBitmap.getHeight(), null);
    
                    mphotoImage = bitmap;
    
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    
        private Bitmap BuildBitmapInfo(int age, String gender) {
    System.out.println(gender + " age:" + age);
            infoText.setText(gender + " age:" + age );
            infoText.setDrawingCacheEnabled(true);
            Bitmap bitmap =  Bitmap.createBitmap(infoText.getDrawingCache());
            infoText.destroyDrawingCache();
            return bitmap;
        }
    
        private void initEvent() {
            getImage_btn.setOnClickListener(this);
            image_detect_btn.setOnClickListener(this);
            capture_btn.setOnClickListener(this);
        }
    
        private void initView() {
            getImage_btn = (Button) findViewById(R.id.get_image);
            image_detect_btn = (Button) findViewById(R.id.detect_image);
            capture_btn = (Button) findViewById(R.id.capture_image);
            loadingView = findViewById(R.id.loading);
            photoView = (ImageView) findViewById(R.id.photo_image);
            num_detected = (TextView) findViewById(R.id.num_detected);
            infoText = (TextView) findViewById(R.id.info_text);
    
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
            switch(requestCode) {
            //获取图片的路径
                case PIC_CODE:
                    if(null != intent) {
                        Uri uri = intent.getData();
                        Cursor cursor = getContentResolver().query( uri, null, null, null, null);
                        if (cursor==null) {
                            Log.e("M", "null");
                        }
                        cursor.moveToFirst();
    
                        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
                        mcurrentPhotoPath = cursor.getString(idx);
                        cursor.close();
    
                        resizePhoto();
    
                        photoView.setImageBitmap(mphotoImage);
                        num_detected.setText("");
                    }
                    break;
                case 2:
                    Bitmap bmPhoto = (Bitmap) intent.getExtras().get("data");  
                    mcurrentPhotoPath = "capturing";
                    mphotoImage = bmPhoto;
                    photoView.setImageBitmap(mphotoImage);
                    num_detected.setText("");
                    break;
            }
        }
    
    
        /**
         * 用来压缩图片的方法
         */
        private void resizePhoto() {
            BitmapFactory.Options options = new Options();
            options.inJustDecodeBounds = true;
    
            BitmapFactory.decodeFile(mcurrentPhotoPath, options);
    
            double ratio = Math.max(options.outWidth*1.0d/1024 , options.outHeight*1.0d/1024);
    
            options.inSampleSize = (int)Math.ceil(ratio);
    
            options.inJustDecodeBounds = false;
    
            mphotoImage = BitmapFactory.decodeFile(mcurrentPhotoPath, options);
        }
    
        @Override
        public void onClick(View v) {
            switch(v.getId()) {
                case R.id.get_image:
                    Intent intent = new Intent(Intent.ACTION_PICK);
                    intent.setType("image/*");
                    startActivityForResult(intent, PIC_CODE);
                    break;
    
                case R.id.capture_image:
                    Intent intent2 = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
                    startActivityForResult(intent2, 2);  
                    break;
                case R.id.detect_image:
                    loadingView.setVisibility(View.VISIBLE);
                    if(mcurrentPhotoPath!=null && !mcurrentPhotoPath.trim().equals("")) {
                        if(mcurrentPhotoPath.equals("capturing")) {
    
                        }else {
                            resizePhoto();
                        }
                    }else {
                        mphotoImage = BitmapFactory.decodeResource(getResources(), R.drawable.brother2);
                    }
    
                    FaceDetect.detect(mphotoImage, new FaceDetect.Callback() {
                        @Override
                        public void success(JSONObject result) {
                            Message msg = Message.obtain(mhandler);
                            msg.what = RESULT_OK;
                            msg.obj = result;
                            msg.sendToTarget();
                        }
    
                        @Override
                        public void error(FaceppParseException exception) {
                            Message msg = Message.obtain(mhandler);
                            msg.what = RESULT_CANCELED;
                            msg.obj = exception.getErrorMessage();
                            msg.sendToTarget();
                        }
                    });
                    break;
            }
    
        }
    
    }
    
    </code></pre>
    
    

    mainactivity的对应布局文件

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    
        <Button
            android:id="@+id/get_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_marginRight="10dp"
            android:text="Get Image" />
    
        <Button
            android:id="@+id/detect_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginRight="10dp"
            android:layout_toLeftOf="@+id/get_image"
            android:text="Detect" />
    
        <TextView
            android:id="@+id/num_detected"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginRight="10dp"
            android:layout_toLeftOf="@+id/detect_image"
            android:layout_alignTop="@+id/detect_image"
            android:gravity="center"
            android:text="find: 0" />
    
        <ImageView
            android:id="@+id/photo_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@+id/detect_image"
            android:layout_alignParentLeft="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true" 
            android:src="@drawable/brother2"/>
    
        <FrameLayout 
            android:id="@+id/loading"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clickable="true"
            android:visibility="gone">
            <ProgressBar 
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"   
             />
    
            <TextView 
                android:id="@+id/info_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:visibility="invisible"
                android:textColor="#AEEEEEff"
                android:layout_gravity="center"
                android:textSize="18sp"
                android:text=" "
                />
    
    
        </FrameLayout>
    
        <Button
            android:id="@+id/capture_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/num_detected"
            android:layout_alignBottom="@+id/num_detected"
            android:layout_alignParentLeft="true"
            android:text="Capture" />
    
    </RelativeLayout>

    常量类

    package com.crazylin.facedetected;
    
    public class Constant {
        public static final String KEY = "a9f32d6fd94da04bc162caabe7e87400";
        public static final String SECRET = "BP9B_33cGnuwPOi4cq2bqNTTTeeLb3cV";
    }
    

    请求数据类

    package com.crazylin.facedetected;
    
    import java.io.ByteArrayOutputStream;
    
    import org.json.JSONObject;
    
    import android.graphics.Bitmap;
    import android.util.Log;
    
    import com.facepp.error.FaceppParseException;
    import com.facepp.http.HttpRequests;
    import com.facepp.http.PostParameters;
    
    public class FaceDetect {
        public interface Callback {
            void success(JSONObject result);
    
            void error(FaceppParseException exeception);
        }
    
        public static void detect(final Bitmap bm,final Callback callback) {
            new Thread(new Runnable() {
    
                @Override
                public void run() {
                    try {
                        //向Face++服务器提交请求
    System.out.println("向Face++服务器提交请求");
                        HttpRequests requests = new HttpRequests(Constant.KEY, Constant.SECRET, true, true);
                        Bitmap bmsmall = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight());
                        ByteArrayOutputStream stream = new ByteArrayOutputStream();
                        bmsmall.compress(Bitmap.CompressFormat.JPEG, 50, stream);
    
                        byte[] bytes = stream.toByteArray();
                        PostParameters params = new PostParameters();
                        params.setImg(bytes);
                        JSONObject json = requests.detectionDetect(params);
                        Log.e("Tag", json.toString());
    
                        if (null != callback) {
                            callback.success(json);
                        }
                    } catch (FaceppParseException e) {
                        System.out.println(e.toString());
                        e.printStackTrace();
                        if(null != callback) {
                            callback.error(e);
                        }
                    }
                }
            }).start();
        }
    }
    

    ok,需要的尽管拿走吧。
    下载地址
    http://download.csdn.net/detail/u013270444/9437964

    泰山崩于前而色不变的曹新雨,抱歉
  • 相关阅读:
    1365 Fib(N) mod Fib(K) [斐波那契相关]
    51nod1439 互质对 [莫比乌斯函数, 容斥]
    UVA1642 魔法GCD Magical GCD [gcd, 双向链表]
    李超线段树学习笔记 [模板]
    P4297 [NOI2006]网络收费 [树形dp]
    田忌赛马 [贪心(完成) / 动态规划(待填坑)]
    菌落 [状压dp?]
    异或约数和 [异或相关]
    java 驼峰命名
    java 静态构造函数
  • 原文地址:https://www.cnblogs.com/caoxinyu/p/6647950.html
Copyright © 2011-2022 走看看