Frame snapshot sync fix (hopefully) and other randomisation of snapshot and only send 3 snaps (no mouth_right anymore)
This commit is contained in:
parent
e8b4a03c9d
commit
907e9005af
5 changed files with 49 additions and 27 deletions
|
@ -37,7 +37,7 @@
|
||||||
<ConfirmationsSetting value="0" id="Add" />
|
<ConfirmationsSetting value="0" id="Add" />
|
||||||
<ConfirmationsSetting value="0" id="Remove" />
|
<ConfirmationsSetting value="0" id="Remove" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_7" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
|
||||||
<output url="file://$PROJECT_DIR$/build/classes" />
|
<output url="file://$PROJECT_DIR$/build/classes" />
|
||||||
</component>
|
</component>
|
||||||
<component name="ProjectType">
|
<component name="ProjectType">
|
||||||
|
|
|
@ -406,27 +406,27 @@ public class ApiRestClient {
|
||||||
// RIGHT MOUTH CORNER
|
// RIGHT MOUTH CORNER
|
||||||
// Crop: http://stackoverflow.com/a/31698091
|
// Crop: http://stackoverflow.com/a/31698091
|
||||||
// reuse margin of brows to make a square image
|
// reuse margin of brows to make a square image
|
||||||
left = (int) hit.points[24].x - margin;
|
// left = (int) hit.points[24].x - margin;
|
||||||
right = (int) hit.points[24].x + 3 * margin;
|
// right = (int) hit.points[24].x + 3 * margin;
|
||||||
top = (int) hit.points[24].y - 2 * margin;
|
// top = (int) hit.points[24].y - 2 * margin;
|
||||||
bottom = (int) hit.points[24].y + 2 * margin;
|
// bottom = (int) hit.points[24].y + 2 * margin;
|
||||||
Rect rect3 = new Rect(left, top, right, bottom);
|
// Rect rect3 = new Rect(left, top, right, bottom);
|
||||||
// Be sure that there is at least 1px to slice.
|
//// Be sure that there is at least 1px to slice.
|
||||||
if(!(rect3.left < rect3.right && rect3.top < rect3.bottom)) {
|
// if(!(rect3.left < rect3.right && rect3.top < rect3.bottom)) {
|
||||||
Log.e("API", "Error in point positions."+" left: " + rect3.left + " right: " + rect3.right + " top: " + rect3.top + " bottom: " + rect3.bottom );
|
// Log.e("API", "Error in point positions."+" left: " + rect3.left + " right: " + rect3.right + " top: " + rect3.top + " bottom: " + rect3.bottom );
|
||||||
continue; // strange bug... skip it and drop the file anyway
|
// continue; // strange bug... skip it and drop the file anyway
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
croppedBmp = Bitmap.createBitmap(rect3.right-rect3.left, rect3.bottom-rect3.top, Bitmap.Config.ARGB_8888);
|
// croppedBmp = Bitmap.createBitmap(rect3.right-rect3.left, rect3.bottom-rect3.top, Bitmap.Config.ARGB_8888);
|
||||||
// draw source bitmap into resulting image at given position:
|
//// draw source bitmap into resulting image at given position:
|
||||||
new Canvas(croppedBmp).drawBitmap(img, -rect3.left, -rect3.top, null);
|
// new Canvas(croppedBmp).drawBitmap(img, -rect3.left, -rect3.top, null);
|
||||||
|
//
|
||||||
ByteArrayOutputStream stream3 = new ByteArrayOutputStream();
|
// ByteArrayOutputStream stream3 = new ByteArrayOutputStream();
|
||||||
croppedBmp.compress(Bitmap.CompressFormat.JPEG, 90, stream3);
|
// croppedBmp.compress(Bitmap.CompressFormat.JPEG, 90, stream3);
|
||||||
byte[] imageBytes3 = stream3.toByteArray();
|
// byte[] imageBytes3 = stream3.toByteArray();
|
||||||
|
//
|
||||||
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 :-)
|
// LEFT MOUTH CORNER (doing whole mouth :-)
|
||||||
|
|
|
@ -273,6 +273,8 @@ public class GameOpenHelper extends SQLiteOpenHelper {
|
||||||
}
|
}
|
||||||
|
|
||||||
saveAchievementsForGame(game);
|
saveAchievementsForGame(game);
|
||||||
|
|
||||||
|
db.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Game[] getGamesForLevel(int lvl_id) {
|
public Game[] getGamesForLevel(int lvl_id) {
|
||||||
|
|
|
@ -258,9 +258,8 @@ public class GamingActivity extends AppCompatActivity implements Detector.ImageL
|
||||||
} else {
|
} else {
|
||||||
hideText(); // hide textView as we want as few elements as possible.
|
hideText(); // hide textView as we want as few elements as possible.
|
||||||
Face face = list.get(0);
|
Face face = list.get(0);
|
||||||
currentScenario.setCurrentFace(face);
|
currentScenario.setCurrentFaceAndFrame(face, (Frame.ByteArrayFrame) frame);
|
||||||
scenarioView.setCurrentAttributeScoresForFace(face);
|
scenarioView.setCurrentAttributeScoresForFace(face);
|
||||||
currentScenario.currentFrame = (Frame.ByteArrayFrame) frame;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,9 +13,14 @@ import com.affectiva.android.affdex.sdk.Frame;
|
||||||
import com.affectiva.android.affdex.sdk.detector.Face;
|
import com.affectiva.android.affdex.sdk.detector.Face;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Random;
|
||||||
import java.util.Timer;
|
import java.util.Timer;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
|
|
||||||
|
@ -115,6 +120,12 @@ public class Scenario {
|
||||||
*/
|
*/
|
||||||
protected boolean lostFace = false;
|
protected boolean lostFace = false;
|
||||||
|
|
||||||
|
public static int MAX_SNAPSHOTS = 5;
|
||||||
|
/**
|
||||||
|
* Which targets to capture an image of
|
||||||
|
*/
|
||||||
|
List<Target> snapTargets;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The scorres in this moment, as to draw them on the screen.
|
* The scorres in this moment, as to draw them on the screen.
|
||||||
* Indexes are Emotion ordinals
|
* Indexes are Emotion ordinals
|
||||||
|
@ -165,6 +176,16 @@ public class Scenario {
|
||||||
rs = RenderScript.create(_activity);
|
rs = RenderScript.create(_activity);
|
||||||
squarePaint = new Paint();
|
squarePaint = new Paint();
|
||||||
squarePaint.setColor(Color.YELLOW);
|
squarePaint.setColor(Color.YELLOW);
|
||||||
|
|
||||||
|
// determine before start which targets will be stored and send
|
||||||
|
// only do it randomly so we don't need to do ALL and yet have spread across the level.
|
||||||
|
snapTargets = pickNRandom(targets, MAX_SNAPSHOTS);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<Target> pickNRandom(List<Target> lst, int n) {
|
||||||
|
List<Target> copy = new LinkedList<Target>(lst);
|
||||||
|
Collections.shuffle(copy);
|
||||||
|
return copy.subList(0, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -208,7 +229,7 @@ public class Scenario {
|
||||||
|
|
||||||
|
|
||||||
Bitmap outputBitmap = null;
|
Bitmap outputBitmap = null;
|
||||||
if(currentFrame != null && bitmapCount < 5) {
|
if(currentFrame != null && snapTargets.contains(target) ) {
|
||||||
// convert NV21 byteArrayFrame from camera to RGB bitmap.
|
// convert NV21 byteArrayFrame from camera to RGB bitmap.
|
||||||
Frame.ByteArrayFrame byteArrayFrame = (Frame.ByteArrayFrame) currentFrame;
|
Frame.ByteArrayFrame byteArrayFrame = (Frame.ByteArrayFrame) currentFrame;
|
||||||
outputBitmap = Nv21Image.nv21ToBitmap(rs, byteArrayFrame.getByteArray(), byteArrayFrame.getWidth(), byteArrayFrame.getHeight());
|
outputBitmap = Nv21Image.nv21ToBitmap(rs, byteArrayFrame.getByteArray(), byteArrayFrame.getWidth(), byteArrayFrame.getHeight());
|
||||||
|
@ -222,7 +243,6 @@ public class Scenario {
|
||||||
matrix.postRotate((int) rotation.toDouble());
|
matrix.postRotate((int) rotation.toDouble());
|
||||||
// int width = rotation == Frame.ROTATE.BY_180 ? outputBitmap.getWidth() : outputBitmap.getHeight();
|
// int width = rotation == Frame.ROTATE.BY_180 ? outputBitmap.getWidth() : outputBitmap.getHeight();
|
||||||
// int height = rotation == Frame.ROTATE.BY_180 ? outputBitmap.getHeight() : outputBitmap.getWidth();
|
// int height = rotation == Frame.ROTATE.BY_180 ? outputBitmap.getHeight() : outputBitmap.getWidth();
|
||||||
// TODO: max 5 bitmaps
|
|
||||||
outputBitmap = Bitmap.createBitmap(outputBitmap , 0, 0, outputBitmap .getWidth(), outputBitmap .getHeight(), matrix, true);
|
outputBitmap = Bitmap.createBitmap(outputBitmap , 0, 0, outputBitmap .getWidth(), outputBitmap .getHeight(), matrix, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -382,9 +402,10 @@ public class Scenario {
|
||||||
|
|
||||||
|
|
||||||
// TODO: create AttributeScoreCollection class, with this method.
|
// TODO: create AttributeScoreCollection class, with this method.
|
||||||
public void setCurrentFace(Face face)
|
public synchronized void setCurrentFaceAndFrame(Face face, Frame.ByteArrayFrame frame)
|
||||||
{
|
{
|
||||||
currentFace = face;
|
currentFace = face;
|
||||||
|
currentFrame = frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isFinished()
|
public boolean isFinished()
|
||||||
|
|
Loading…
Reference in a new issue