안 드 로 이 드 는 얼굴++패 키 지 를 사용 하여 얼굴 인식 을 실현 한다.
오늘 은 페 이 스++를 통 해 얼굴 인식 을 할 수 있 는 기능 을 보 여 드 리 겠 습 니 다.
우리 먼저 이 페 이 스+홈 페이지 에 가 보 자.http://www.faceplusplus.com.cn
저희 가 사례 를 클릭 하면 저희 가 잘 아 는 소프트웨어 가 이 회사 에서 제공 하 는 SDK 를 많이 볼 수 있 습 니 다.
그리고 저 희 는 개발 자 센터 의 개발 도구 와 sdk 를 클릭 하여 저희 가 필요 로 하 는 sdk 를 다운로드 합 니 다.
그 다음 에 제 애플 리 케 이 션 의 생 성 애플 리 케 이 션 을 클릭 하면 키 두 개 를 주 실 거 예요.
이 두 값 을 저장 하려 면 프로그램 에서 사용 해 야 합 니 다.
제 가 오늘 이 루 는 건 얼굴 캡 처 를 하고 성별 과 나 이 를 식별 하 는 거 예요.효과 도 를 볼 게 요.
잡담 은 그만 하고 실현 을 보 자.
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.