Android静态图片人脸识别的完整demo(附完整源码)

Demo功能:利用android自带的人脸识别进行识别,标记出眼睛和人脸位置。点击按键后进行人脸识别,完毕后显示到imageview上。

第一部分:布局文件activity_main.xml

<RelativeLayout xmlns:android=""xmlns:tools=""android:id="@+id/layout_main"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context=".MainActivity" ><TextViewandroid:id="@+id/textview_hello"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/hello_world" /><ImageViewandroid:id="@+id/imgview"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/textview_hello" /><Buttonandroid:id="@+id/btn_detect_face"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/imgview"android:layout_centerHorizontal="true"android:text="检测人脸" /></RelativeLayout>注意:ImageView四周的padding由布局文件里的这四句话决定: android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"而上面的两个margin定义在dimens.xml文件里:<resources><!– Default screen margins, per the Android Design guidelines. –><dimen name="activity_horizontal_margin">16dp</dimen><dimen name="activity_vertical_margin">16dp</dimen></resources>这里采用的都是默认的,可以忽略!

第二部分:MainActivity.java

package org.yanzi.testfacedetect;import org.yanzi.util.ImageUtil;import org.yanzi.util.MyToast;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Point;import android.graphics.PointF;import android.graphics.Rect;import android.media.FaceDetector;import android.media.FaceDetector.Face;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.DisplayMetrics;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.view.ViewGroup.LayoutParams;import android.widget.Button;import android.widget.ImageView;import android.widget.ProgressBar;import android.widget.RelativeLayout;public class MainActivity extends Activity {static final String tag = "yan";ImageView imgView = null;FaceDetector faceDetector = null;FaceDetector.Face[] face;Button detectFaceBtn = null;final int N_MAX = 2;ProgressBar progressBar = null;Bitmap srcImg = null;Bitmap srcFace = null;Thread checkFaceThread = new Thread(){@Overridepublic void run() {// TODO Auto-generated method stubBitmap faceBitmap = detectFace();mainHandler.sendEmptyMessage(2);Message m = new Message();m.what = 0;m.obj = faceBitmap;mainHandler.sendMessage(m);}}; Handler mainHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stub//super.handleMessage(msg);switch (msg.what){case 0:Bitmap b = (Bitmap) msg.obj;imgView.setImageBitmap(b);MyToast.showToast(getApplicationContext(), "检测完毕");break;case 1:showProcessBar();break;case 2:progressBar.setVisibility(View.GONE);detectFaceBtn.setClickable(false);break;default:break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initUI(); initFaceDetect();detectFaceBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubmainHandler.sendEmptyMessage(1);checkFaceThread.start();}});}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}public void initUI(){detectFaceBtn = (Button)findViewById(R.id.btn_detect_face);imgView = (ImageView)findViewById(R.id.imgview);LayoutParams params = imgView.getLayoutParams();DisplayMetrics dm = getResources().getDisplayMetrics();int w_screen = dm.widthPixels;//int h = dm.heightPixels;srcImg = BitmapFactory.decodeResource(getResources(), R.drawable.kunlong);int h = srcImg.getHeight();int w = srcImg.getWidth();float r = (float)h/(float)w;params.width = w_screen;params.height = (int)(params.width * r);imgView.setLayoutParams(params);imgView.setImageBitmap(srcImg);}public void initFaceDetect(){this.srcFace = srcImg.copy(Config.RGB_565, true);int w = srcFace.getWidth();int h = srcFace.getHeight();Log.i(tag, "待检测图像: w = " + w + "h = " + h);faceDetector = new FaceDetector(w, h, N_MAX);face = new FaceDetector.Face[N_MAX];}public boolean checkFace(Rect rect){int w = rect.width();int h = rect.height();int s = w*h;Log.i(tag, "人脸 宽w = " + w + "高h = " + h + "人脸面积 s = " + s);if(s < 10000){Log.i(tag, "无效人脸,舍弃.");return false;}else{Log.i(tag, "有效人脸,保存.");return true;}}public Bitmap detectFace(){//Drawable d = getResources().getDrawable(R.drawable.face_2);//Log.i(tag, "Drawable尺寸 w = " + d.getIntrinsicWidth() + "h = " + d.getIntrinsicHeight());//BitmapDrawable bd = (BitmapDrawable)d;//Bitmap srcFace = bd.getBitmap();int nFace = faceDetector.findFaces(srcFace, face);Log.i(tag, "检测到人脸:n = " + nFace);for(int i=0; i<nFace; i++){Face f = face[i];PointF midPoint = new PointF();float dis = f.eyesDistance();f.getMidPoint(midPoint);int dd = (int)(dis);Point eyeLeft = new Point((int)(midPoint.x – dis/2), (int)midPoint.y);Point eyeRight = new Point((int)(midPoint.x + dis/2), (int)midPoint.y);Rect faceRect = new Rect((int)(midPoint.x – dd), (int)(midPoint.y – dd), (int)(midPoint.x + dd), (int)(midPoint.y + dd));Log.i(tag, "左眼坐标 x = " + eyeLeft.x + "y = " + eyeLeft.y);if(checkFace(faceRect)){Canvas canvas = new Canvas(srcFace);Paint p = new Paint();p.setAntiAlias(true);p.setStrokeWidth(8);p.setStyle(Paint.Style.STROKE);p.setColor(Color.GREEN);canvas.drawCircle(eyeLeft.x, eyeLeft.y, 20, p);canvas.drawCircle(eyeRight.x, eyeRight.y, 20, p);canvas.drawRect(faceRect, p);}}ImageUtil.saveJpeg(srcFace);Log.i(tag, "保存完毕");//将绘制完成后的faceBitmap返回return srcFace;}public void showProcessBar(){RelativeLayout mainLayout = (RelativeLayout)findViewById(R.id.layout_main);progressBar = new ProgressBar(MainActivity.this, null, android.R.attr.progressBarStyleLargeInverse); //ViewGroup.LayoutParams.WRAP_CONTENTRelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);params.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);params.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);progressBar.setVisibility(View.VISIBLE);//progressBar.setLayoutParams(params);mainLayout.addView(progressBar, params);}}关于上述代码,注意以下几点:夺冠那一刻,豪情万丈!登顶那一瞬,万众瞩目!那一刻的嫣然一笑,

Android静态图片人脸识别的完整demo(附完整源码)

相关文章:

你感兴趣的文章:

标签云: