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
泰山崩于前而色不变的曹新雨,抱歉