package com.arcsoft.sdk_demo;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.ImageFormat;
import android.graphics.Rect;
import android.graphics.YuvImage;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import com.arcsoft.ageestimation.ASAE_FSDKAge;
import com.arcsoft.ageestimation.ASAE_FSDKEngine;
import com.arcsoft.ageestimation.ASAE_FSDKError;
import com.arcsoft.ageestimation.ASAE_FSDKFace;
import com.arcsoft.ageestimation.ASAE_FSDKVersion;
import com.arcsoft.facerecognition.AFR_FSDKEngine;
import com.arcsoft.facerecognition.AFR_FSDKError;
import com.arcsoft.facerecognition.AFR_FSDKFace;
import com.arcsoft.facerecognition.AFR_FSDKMatching;
import com.arcsoft.facerecognition.AFR_FSDKVersion;
import com.arcsoft.facetracking.AFT_FSDKEngine;
import com.arcsoft.facetracking.AFT_FSDKError;
import com.arcsoft.facetracking.AFT_FSDKFace;
import com.arcsoft.facetracking.AFT_FSDKVersion;
import com.arcsoft.genderestimation.ASGE_FSDKEngine;
import com.arcsoft.genderestimation.ASGE_FSDKError;
import com.arcsoft.genderestimation.ASGE_FSDKFace;
import com.arcsoft.genderestimation.ASGE_FSDKGender;
import com.arcsoft.genderestimation.ASGE_FSDKVersion;
import com.guo.android_extend.java.AbsLoop;
import com.guo.android_extend.java.ExtByteArrayOutputStream;
import com.guo.android_extend.tools.CameraHelper;
import com.guo.android_extend.widget.CameraFrameData;
import com.guo.android_extend.widget.CameraGLSurfaceView;
import com.guo.android_extend.widget.CameraSurfaceView;
import com.guo.android_extend.widget.CameraSurfaceView.OnCameraListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by gqj3375 on 2017/4/28.
*/
public class DetecterActivity extends Activity implements OnCameraListener, View.OnTouchListener, Camera.AutoFocusCallback, View.OnClickListener {
private final String TAG = this.getClass().getSimpleName();
private int mWidth, mHeight, mFormat;
private CameraSurfaceView mSurfaceView;
private CameraGLSurfaceView mGLSurfaceView;
private Camera mCamera;
AFT_FSDKVersion version = new AFT_FSDKVersion();
AFT_FSDKEngine engine = new AFT_FSDKEngine();
ASAE_FSDKVersion mAgeVersion = new ASAE_FSDKVersion();
ASAE_FSDKEngine mAgeEngine = new ASAE_FSDKEngine();
ASGE_FSDKVersion mGenderVersion = new ASGE_FSDKVersion();
ASGE_FSDKEngine mGenderEngine = new ASGE_FSDKEngine();
List<AFT_FSDKFace> result = new ArrayList<>();
List<ASAE_FSDKAge> ages = new ArrayList<>();
List<ASGE_FSDKGender> genders = new ArrayList<>();
int mCameraID;
int mCameraRotate;
boolean mCameraMirror;
byte[] mImageNV21 = null;
FRAbsLoop mFRAbsLoop = null;
AFT_FSDKFace mAFT_FSDKFace = null;
Handler mHandler;
boolean isPostted = false;
Runnable hide = new Runnable() {
@Override
public void run() {
mTextView.setAlpha(0.5f);
mImageView.setImageAlpha(128);
isPostted = false;
}
};
class FRAbsLoop extends AbsLoop {
AFR_FSDKVersion version = new AFR_FSDKVersion();
AFR_FSDKEngine engine = new AFR_FSDKEngine();
AFR_FSDKFace result = new AFR_FSDKFace();
List<FaceDB.FaceRegist> mResgist = ((Application)DetecterActivity.this.getApplicationContext()).mFaceDB.mRegister;
List<ASAE_FSDKFace> face1 = new ArrayList<>();
List<ASGE_FSDKFace> face2 = new ArrayList<>();
@Override
public void setup() {
AFR_FSDKError error = engine.AFR_FSDK_InitialEngine(FaceDB.appid, FaceDB.fr_key);
Log.d(TAG, "AFR_FSDK_InitialEngine = " + error.getCode());
error = engine.AFR_FSDK_GetVersion(version);
Log.d(TAG, "FR=" + version.toString() + "," + error.getCode()); //(210, 178 - 478, 446), degree = 1 780, 2208 - 1942, 3370
}
@Override
public void loop() {
if (mImageNV21 != null) {
final int rotate = mCameraRotate;
long time = System.currentTimeMillis();
AFR_FSDKError error = engine.AFR_FSDK_ExtractFRFeature(mImageNV21, mWidth, mHeight, AFR_FSDKEngine.CP_PAF_NV21, mAFT_FSDKFace.getRect(), mAFT_FSDKFace.getDegree(), result);
Log.d(TAG, "AFR_FSDK_ExtractFRFeature cost :" + (System.currentTimeMillis() - time) + "ms");
Log.d(TAG, "Face=" + result.getFeatureData()[0] + "," + result.getFeatureData()[1] + "," + result.getFeatureData()[2] + "," + error.getCode());
AFR_FSDKMatching score = new AFR_FSDKMatching();
float max = 0.0f;
String name = null;
for (FaceDB.FaceRegist fr : mResgist) {
for (AFR_FSDKFace face : fr.mFaceList) {
error = engine.AFR_FSDK_FacePairMatching(result, face, score);
Log.d(TAG, "Score:" + score.getScore() + ", AFR_FSDK_FacePairMatching=" + error.getCode());
if (max < score.getScore()) {
max = score.getScore();
name = fr.mName;
}
}
}
//age & gender
face1.clear();
face2.clear();
face1.add(new ASAE_FSDKFace(mAFT_FSDKFace.getRect(), mAFT_FSDKFace.getDegree()));
face2.add(new ASGE_FSDKFace(mAFT_FSDKFace.getRect(), mAFT_FSDKFace.getDegree()));
ASAE_FSDKError error1 = mAgeEngine.ASAE_FSDK_AgeEstimation_Image(mImageNV21, mWidth, mHeight, AFT_FSDKEngine.CP_PAF_NV21, face1, ages);
ASGE_FSDKError error2 = mGenderEngine.ASGE_FSDK_GenderEstimation_Image(mImageNV21, mWidth, mHeight, AFT_FSDKEngine.CP_PAF_NV21, face2, genders);
Log.d(TAG, "ASAE_FSDK_AgeEstimation_Image:" + error1.getCode() + ",ASGE_FSDK_GenderEstimation_Image:" + error2.getCode());
Log.d(TAG, "age:" + ages.get(0).getAge() + ",gender:" + genders.get(0).getGender());
final String age = ages.get(0).getAge() == 0 ? "年龄未知" : ages.get(0).getAge() + "岁";
final String gender = genders.get(0).getGender() == -1 ? "性别未知" : (genders.get(0).getGender() == 0 ? "男" : "女");
//crop
byte[] data = mImageNV21;
YuvImage yuv = new YuvImage(data, ImageFormat.NV21, mWidth, mHeight, null);
ExtByteArrayOutputStream ops = new ExtByteArrayOutputStream();
yuv.compressToJpeg(mAFT_FSDKFace.getRect(), 80, ops);
final Bitmap bmp = BitmapFactory.decodeByteArray(ops.getByteArray(), 0, ops.getByteArray().length);
try {
ops.close();
} catch (IOException e) {
e.printStackTrace();
}
if (max > 0.6f) {
//fr success.
final float max_score = max;
Log.d(TAG, "fit Score:" + max + ", NAME:" + name);
final String mNameShow = name;
mHandler.removeCallbacks(hide);
mHandler.post(new Runnable() {
@Override
public void run() {
mTextView.setAlpha(1.0f);
mTextView.setText(mNameShow);
mTextView.setTextColor(Color.RED);
mTextView1.setVisibility(View.VISIBLE);
mTextView1.setText("置信度:" + (float)((int)(max_score * 1000)) / 1000.0);
mTextView1.setTextColor(Color.RED);
mImageView.setRotation(rotate);
if (mCameraMirror) {
mImageView.setScaleY(-1);
}
mImageView.setImageAlpha(255);
mImageView.setImageBitmap(bmp);
}
});
} else {
final String mNameShow = "未识别";
DetecterActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
mTextView.setAlpha(1.0f);
mTextView1.setVisibility(View.VISIBLE);
mTextView1.setText( gender + "," + age);
mTextView1.setTextColor(Color.RED);
mTextView.setText(mNameShow);
mTextView.setTextColor(Color.RED);
mImageView.setImageAlpha(255);
mImageView.setRotation(rotate);
if (mCameraMirror) {
mImageView.setScaleY(-1);
}
mImageView.setImageBitmap(bmp);
}
});
}
mImageNV21 = null;
Log.d(TAG, "AFR_FSDK_ExtractFRFeature Loop cost :" + (System.currentTimeMillis() - time) + "ms");
}
}
@Override
public void over() {
AFR_FSDKError error = engine.A