Add extra expression parameters, extra image creation and small fixes, and android version bump

This commit is contained in:
Ruben 2016-09-19 01:12:38 +01:00
parent dd4241c05f
commit e8b4a03c9d
6 changed files with 85 additions and 12 deletions

View file

@ -9,8 +9,8 @@ android {
applicationId 'com.rubenvandeven.emotion_hero' applicationId 'com.rubenvandeven.emotion_hero'
minSdkVersion 16 minSdkVersion 16
targetSdkVersion 24 targetSdkVersion 24
versionCode 4 versionCode 6
versionName '0.4' versionName '0.5'
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
renderscriptTargetApi 16 renderscriptTargetApi 16
@ -33,7 +33,7 @@ dependencies {
}) })
compile 'com.android.support:appcompat-v7:24.2.0' compile 'com.android.support:appcompat-v7:24.2.0'
compile 'com.android.support:support-v4:24.2.0' compile 'com.android.support:support-v4:24.2.0'
compile 'com.affectiva.android:affdexsdk:3.1' compile 'com.affectiva.android:affdexsdk:3.1.2'
compile 'com.google.code.gson:gson:2.4' compile 'com.google.code.gson:gson:2.4'
compile 'com.android.support:design:24.2.0' compile 'com.android.support:design:24.2.0'
compile 'com.loopj.android:android-async-http:1.4.9' compile 'com.loopj.android:android-async-http:1.4.9'

View file

@ -76,6 +76,7 @@ public class ApiRestClient {
*/ */
public void requestWithJWT(final String method, final String url, final StringEntity postBody, final RequestParams getParams, final AsyncHttpResponseHandler responseHandler) { public void requestWithJWT(final String method, final String url, final StringEntity postBody, final RequestParams getParams, final AsyncHttpResponseHandler responseHandler) {
// sync call, so we can return a value! // sync call, so we can return a value!
Log.v("API", "register");
client.post(BASE_URL + "/api/register", null, new JsonHttpResponseHandler() { client.post(BASE_URL + "/api/register", null, new JsonHttpResponseHandler() {
@Override @Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) { public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
@ -99,6 +100,16 @@ public class ApiRestClient {
e.printStackTrace(); e.printStackTrace();
} }
} }
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
handleOnFailure(statusCode, headers, responseString, throwable);
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject response) {
onFailure(statusCode, headers, response == null ? null:response.toString(), throwable);
}
}); });
} }
@ -335,6 +346,7 @@ public class ApiRestClient {
for(Hit hit: hits) { for(Hit hit: hits) {
Bitmap img = gameHelper.getImageForHit(hit); Bitmap img = gameHelper.getImageForHit(hit);
if(img == null) { if(img == null) {
Log.e("API", "no image for hit " + hit.id); Log.e("API", "no image for hit " + hit.id);
continue; continue;
@ -415,6 +427,32 @@ public class ApiRestClient {
params.put(hit.remoteId + ":mouth_right", new ByteArrayInputStream(imageBytes3), hit.remoteId + "-mouth_right.jpg", "image/jpeg"); params.put(hit.remoteId + ":mouth_right", new ByteArrayInputStream(imageBytes3), hit.remoteId + "-mouth_right.jpg", "image/jpeg");
Log.v("API", "add param: " + hit.remoteId + ":mouth_right - length:" + imageBytes.length ); Log.v("API", "add param: " + hit.remoteId + ":mouth_right - length:" + imageBytes.length );
// LEFT MOUTH CORNER (doing whole mouth :-)
// Crop: http://stackoverflow.com/a/31698091
// reuse margin of brows to make a square image
left = (int) hit.points[20].x - margin;
right = (int) hit.points[24].x + margin;
top = (int) (hit.points[21].y < hit.points[23].y ? hit.points[21].y : hit.points[23].y) - margin;
bottom = (int) hit.points[26].y + margin;
Rect rect4 = new Rect(left, top, right, bottom);
// Be sure that there is at least 1px to slice.
if(!(rect4.left < rect4.right && rect4.top < rect4.bottom)) {
Log.e("API", "Error in point positions."+" left: " + rect4.left + " right: " + rect4.right + " top: " + rect4.top + " bottom: " + rect4.bottom );
continue; // strange bug... skip it and drop the file anyway
}
croppedBmp = Bitmap.createBitmap(rect4.right-rect4.left, rect4.bottom-rect4.top, Bitmap.Config.ARGB_8888);
// draw source bitmap into resulting image at given position:
new Canvas(croppedBmp).drawBitmap(img, -rect4.left, -rect4.top, null);
ByteArrayOutputStream stream4 = new ByteArrayOutputStream();
croppedBmp.compress(Bitmap.CompressFormat.JPEG, 90, stream4);
byte[] imageBytes4 = stream4.toByteArray();
params.put(hit.remoteId + ":mouth_left", new ByteArrayInputStream(imageBytes4), hit.remoteId + "-mouth_left.jpg", "image/jpeg");
Log.v("API", "add param: " + hit.remoteId + ":mouth_left - length:" + imageBytes.length );
} }
// don't post if there are no images // don't post if there are no images
@ -428,6 +466,7 @@ public class ApiRestClient {
public void onSuccess(int statusCode, Header[] headers, JSONObject response) { public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
// 3. remove images :-) // 3. remove images :-)
for(Hit hit: hits) { for(Hit hit: hits) {
Log.v("API", "clear image for hit: "+ hit.id);
player.getGameOpenHelper().clearImageForHit(hit); player.getGameOpenHelper().clearImageForHit(hit);
} }
} }

View file

@ -17,7 +17,7 @@ public enum Expression {
LIP_PRESS, LIP_PRESS,
BROW_RAISE, BROW_RAISE,
NOSE_WRINKLER, NOSE_WRINKLER,
LIP_DEPRESSOR, LIP_DEPRESSOR, //lip corner depressor
BROW_FURROW, BROW_FURROW,
ATTENTION, ATTENTION,
SMILE, SMILE,
@ -29,7 +29,13 @@ public enum Expression {
LIP_PUCKER, LIP_PUCKER,
EYE_CLOSURE, EYE_CLOSURE,
ENGAGEMENT, ENGAGEMENT,
VALENCE; VALENCE,
DIMPLER,
CHEEK_RAISE,
EYE_WIDEN,
JAW_DROP,
LID_TIGHTEN,
LIP_STRETCH;
public float getValueFromFace(Face face) public float getValueFromFace(Face face)
{ {
@ -79,6 +85,18 @@ public enum Expression {
return face.emotions.getEngagement(); return face.emotions.getEngagement();
case VALENCE: case VALENCE:
return face.emotions.getValence(); return face.emotions.getValence();
case DIMPLER:
return face.expressions.getDimpler();
case CHEEK_RAISE:
return face.expressions.getCheekRaise();
case EYE_WIDEN:
return face.expressions.getEyeWiden();
case JAW_DROP:
return face.expressions.getJawDrop();
case LID_TIGHTEN:
return face.expressions.getLidTighten();
case LIP_STRETCH:
return face.expressions.getLipStretch();
} }
return 0; return 0;
} }

View file

@ -23,7 +23,7 @@ import java.util.Date;
* adb pull /sdcard/emotionhero.db * adb pull /sdcard/emotionhero.db
*/ */
public class GameOpenHelper extends SQLiteOpenHelper { public class GameOpenHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 6; private static final int DATABASE_VERSION = 7;
private static final String GAME_TABLE_NAME = "games"; private static final String GAME_TABLE_NAME = "games";
private static final String GAME_TABLE_CREATE = private static final String GAME_TABLE_CREATE =
"CREATE TABLE " + GAME_TABLE_NAME + " (" + "CREATE TABLE " + GAME_TABLE_NAME + " (" +
@ -86,6 +86,12 @@ public class GameOpenHelper extends SQLiteOpenHelper {
"eye_closure VARCHAR(20)," + "eye_closure VARCHAR(20)," +
"engagement VARCHAR(20)," + "engagement VARCHAR(20)," +
"valence VARCHAR(20)," + "valence VARCHAR(20)," +
"dimpler VARCHAR(20)," +
"cheek_raise VARCHAR(20)," +
"eye_widen VARCHAR(20)," +
"jaw_drop VARCHAR(20)," +
"lid_tighten VARCHAR(20)," +
"lip_stretch VARCHAR(20)," +
"point_0x VARCHAR(20)," + "point_0x VARCHAR(20)," +
"point_0y VARCHAR(20)," + "point_0y VARCHAR(20)," +
"point_1x VARCHAR(20)," + "point_1x VARCHAR(20)," +
@ -157,7 +163,7 @@ public class GameOpenHelper extends SQLiteOpenHelper {
"image BLOB," + "image BLOB," +
"PRIMARY KEY (id));" ; "PRIMARY KEY (id));" ;
private static final String[] HIT_PROJECTION = { private static final String[] HIT_PROJECTION = {
"id","game_id", "target_index","score","bonus","remoteId","glasses","ethnicity","age","gender","anger","contempt","disgust","fear","joy","sadness","surprise","roll","pitch","yaw","inter_ocular_distance","mouth_open","lip_press","brow_raise","nose_wrinkler","lip_depressor","brow_furrow","attention","smile","inner_brow_raiser","chin_raiser","smirk","lip_suck","upper_lip_raiser","lip_pucker","eye_closure","engagement","valence","point_0x","point_0y","point_1x","point_1y","point_2x","point_2y","point_3x","point_3y","point_4x","point_4y","point_5x","point_5y","point_6x","point_6y","point_7x","point_7y","point_8x","point_8y","point_9x","point_9y","point_10x","point_10y","point_11x","point_11y","point_12x","point_12y","point_13x","point_13y","point_14x","point_14y","point_15x","point_15y","point_16x","point_16y","point_17x","point_17y","point_18x","point_18y","point_19x","point_19y","point_20x","point_20y","point_21x","point_21y","point_22x","point_22y","point_23x","point_23y","point_24x","point_24y","point_25x","point_25y","point_26x","point_26y","point_27x","point_27y","point_28x","point_28y","point_29x","point_29y","point_30x","point_30y","point_31x","point_31y","point_32x","point_32y","point_33x","point_33y" "id","game_id", "target_index","score","bonus","remoteId","glasses","ethnicity","age","gender","anger","contempt","disgust","fear","joy","sadness","surprise","roll","pitch","yaw","inter_ocular_distance","mouth_open","lip_press","brow_raise","nose_wrinkler","lip_depressor","brow_furrow","attention","smile","inner_brow_raiser","chin_raiser","smirk","lip_suck","upper_lip_raiser","lip_pucker","eye_closure","engagement","valence","dimpler","cheek_raise","eye_widen","jaw_drop","lid_tighten","lip_stretch","point_0x","point_0y","point_1x","point_1y","point_2x","point_2y","point_3x","point_3y","point_4x","point_4y","point_5x","point_5y","point_6x","point_6y","point_7x","point_7y","point_8x","point_8y","point_9x","point_9y","point_10x","point_10y","point_11x","point_11y","point_12x","point_12y","point_13x","point_13y","point_14x","point_14y","point_15x","point_15y","point_16x","point_16y","point_17x","point_17y","point_18x","point_18y","point_19x","point_19y","point_20x","point_20y","point_21x","point_21y","point_22x","point_22y","point_23x","point_23y","point_24x","point_24y","point_25x","point_25y","point_26x","point_26y","point_27x","point_27y","point_28x","point_28y","point_29x","point_29y","point_30x","point_30y","point_31x","point_31y","point_32x","point_32y","point_33x","point_33y"
}; };
private static final String GAME_ACH_TABLE_NAME = "game_achievements"; private static final String GAME_ACH_TABLE_NAME = "game_achievements";
@ -211,6 +217,14 @@ public class GameOpenHelper extends SQLiteOpenHelper {
if(oldVersion == 5 && newVersion == 6) { if(oldVersion == 5 && newVersion == 6) {
db.execSQL("ALTER TABLE games ADD lost_face_time VARCHAR(255);"); db.execSQL("ALTER TABLE games ADD lost_face_time VARCHAR(255);");
} }
if(oldVersion == 6 && newVersion == 7) {
db.execSQL("ALTER TABLE games ADD dimpler VARCHAR(20);");
db.execSQL("ALTER TABLE games ADD cheek_raise VARCHAR(20);" );
db.execSQL("ALTER TABLE games ADD eye_widen VARCHAR(20);");
db.execSQL("ALTER TABLE games ADD jaw_drop VARCHAR(20);");
db.execSQL("ALTER TABLE games ADD lid_tighten VARCHAR(20);");
db.execSQL("ALTER TABLE games ADD lip_stretch VARCHAR(20);");
}
} }
@ -228,7 +242,9 @@ public class GameOpenHelper extends SQLiteOpenHelper {
public void clearImageForHit(Hit hit) { public void clearImageForHit(Hit hit) {
String[] params = { Long.toString(hit.id) }; String[] params = { Long.toString(hit.id) };
getWritableDatabase().rawQuery("UPDATE hits SET image = NULL WHERE id = ?", params); Cursor c = getWritableDatabase().rawQuery("UPDATE hits SET image = NULL WHERE id = ?", params);
Log.v("GAME", "clear "+hit.id+" count: "+c.getCount());
} }
public void insertGame(Game game) { public void insertGame(Game game) {
@ -511,8 +527,8 @@ public class GameOpenHelper extends SQLiteOpenHelper {
public int getLocalRankOfGame(Game game) { public int getLocalRankOfGame(Game game) {
String[] params = { Long.toString(game.scenario.id), Double.toString(game.score + game.bonus) }; String[] params = { Long.toString(game.scenario.id), Double.toString(game.score + game.bonus) };
Log.e("GAME",params[0].toString()); // Log.e("GAME",params[0].toString());
Log.e("GAME",params[1].toString()); // Log.e("GAME",params[1].toString());
Cursor c = getReadableDatabase().rawQuery("SELECT COUNT(id)+1 FROM games WHERE lvl_id = ? AND score+bonus > ?", params); Cursor c = getReadableDatabase().rawQuery("SELECT COUNT(id)+1 FROM games WHERE lvl_id = ? AND score+bonus > ?", params);
c.moveToFirst(); c.moveToFirst();
return c.getInt(0); return c.getInt(0);

View file

@ -39,7 +39,7 @@ public class Hit {
public String age; public String age;
public String gender; public String gender;
public Map<Expression, Float> expressions = new HashMap<>(21); // also includes measurements public Map<Expression, Float> expressions = new HashMap<>(Expression.values().length); // also includes measurements
public PointF[] points = new PointF[34]; public PointF[] points = new PointF[34];

View file

@ -170,7 +170,7 @@ public class Scenario {
/** /**
* To be called on each timer tick * To be called on each timer tick
*/ */
public void tick() public synchronized void tick()
{ {
if(!isRunning){ if(!isRunning){
if(lostFace) { if(lostFace) {