aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/examples/android
diff options
context:
space:
mode:
authorGravatar Andrew Harp <andrewharp@google.com>2017-11-03 17:07:50 -0700
committerGravatar TensorFlower Gardener <gardener@tensorflow.org>2017-11-03 17:11:55 -0700
commitbfd39838de87cba85f9edf028c1c30bae86da164 (patch)
tree53ca99d72f13c2b0d62cb1b36ecb16711edb6604 /tensorflow/examples/android
parentf145db3bbd12edd93b18abffb38f78b5f69166c0 (diff)
Android demo: fix handling of landscape rotation mode in classifier and detector demos. To use the orientation must be changed from "portrait" to "landscape" in AndroidManifest.xml. Resolves #9412 and #10348
Stylization demo is still portrait-only due to the complexity of the UI. PiperOrigin-RevId: 174534886
Diffstat (limited to 'tensorflow/examples/android')
-rw-r--r--tensorflow/examples/android/src/org/tensorflow/demo/CameraActivity.java14
-rw-r--r--tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java9
-rw-r--r--tensorflow/examples/android/src/org/tensorflow/demo/DetectorActivity.java9
-rw-r--r--tensorflow/examples/android/src/org/tensorflow/demo/env/ImageUtils.java4
-rw-r--r--tensorflow/examples/android/src/org/tensorflow/demo/tracking/MultiBoxTracker.java9
5 files changed, 29 insertions, 16 deletions
diff --git a/tensorflow/examples/android/src/org/tensorflow/demo/CameraActivity.java b/tensorflow/examples/android/src/org/tensorflow/demo/CameraActivity.java
index 7e57c17467..4e45f42d0c 100644
--- a/tensorflow/examples/android/src/org/tensorflow/demo/CameraActivity.java
+++ b/tensorflow/examples/android/src/org/tensorflow/demo/CameraActivity.java
@@ -37,6 +37,7 @@ import android.os.HandlerThread;
import android.os.Trace;
import android.util.Size;
import android.view.KeyEvent;
+import android.view.Surface;
import android.view.WindowManager;
import android.widget.Toast;
import java.nio.ByteBuffer;
@@ -426,6 +427,19 @@ public abstract class CameraActivity extends Activity
}
}
+ protected int getScreenOrientation() {
+ switch (getWindowManager().getDefaultDisplay().getRotation()) {
+ case Surface.ROTATION_270:
+ return 270;
+ case Surface.ROTATION_180:
+ return 180;
+ case Surface.ROTATION_90:
+ return 90;
+ default:
+ return 0;
+ }
+ }
+
protected abstract void processImage();
protected abstract void onPreviewSizeChosen(final Size size, final int rotation);
diff --git a/tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java b/tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java
index b29fa1546c..e2c394dde9 100644
--- a/tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java
+++ b/tensorflow/examples/android/src/org/tensorflow/demo/ClassifierActivity.java
@@ -27,6 +27,7 @@ import android.os.SystemClock;
import android.util.Size;
import android.util.TypedValue;
import android.view.Display;
+import android.view.Surface;
import java.util.List;
import java.util.Vector;
import org.tensorflow.demo.OverlayView.DrawCallback;
@@ -123,12 +124,8 @@ public class ClassifierActivity extends CameraActivity implements OnImageAvailab
previewWidth = size.getWidth();
previewHeight = size.getHeight();
- final Display display = getWindowManager().getDefaultDisplay();
- final int screenOrientation = display.getRotation();
-
- LOGGER.i("Sensor orientation: %d, Screen orientation: %d", rotation, screenOrientation);
-
- sensorOrientation = rotation + screenOrientation;
+ sensorOrientation = rotation - getScreenOrientation();
+ LOGGER.i("Camera orientation relative to screen canvas: %d", sensorOrientation);
LOGGER.i("Initializing at size %dx%d", previewWidth, previewHeight);
rgbFrameBitmap = Bitmap.createBitmap(previewWidth, previewHeight, Config.ARGB_8888);
diff --git a/tensorflow/examples/android/src/org/tensorflow/demo/DetectorActivity.java b/tensorflow/examples/android/src/org/tensorflow/demo/DetectorActivity.java
index 3c80a2ae3c..7882d87c1c 100644
--- a/tensorflow/examples/android/src/org/tensorflow/demo/DetectorActivity.java
+++ b/tensorflow/examples/android/src/org/tensorflow/demo/DetectorActivity.java
@@ -30,6 +30,7 @@ import android.os.SystemClock;
import android.util.Size;
import android.util.TypedValue;
import android.view.Display;
+import android.view.Surface;
import android.widget.Toast;
import java.io.IOException;
import java.util.LinkedList;
@@ -168,12 +169,8 @@ public class DetectorActivity extends CameraActivity implements OnImageAvailable
previewWidth = size.getWidth();
previewHeight = size.getHeight();
- final Display display = getWindowManager().getDefaultDisplay();
- final int screenOrientation = display.getRotation();
-
- LOGGER.i("Sensor orientation: %d, Screen orientation: %d", rotation, screenOrientation);
-
- sensorOrientation = rotation + screenOrientation;
+ sensorOrientation = rotation - getScreenOrientation();
+ LOGGER.i("Camera orientation relative to screen canvas: %d", sensorOrientation);
LOGGER.i("Initializing at size %dx%d", previewWidth, previewHeight);
rgbFrameBitmap = Bitmap.createBitmap(previewWidth, previewHeight, Config.ARGB_8888);
diff --git a/tensorflow/examples/android/src/org/tensorflow/demo/env/ImageUtils.java b/tensorflow/examples/android/src/org/tensorflow/demo/env/ImageUtils.java
index 5629f179c4..a3c694cddc 100644
--- a/tensorflow/examples/android/src/org/tensorflow/demo/env/ImageUtils.java
+++ b/tensorflow/examples/android/src/org/tensorflow/demo/env/ImageUtils.java
@@ -300,6 +300,10 @@ public class ImageUtils {
final Matrix matrix = new Matrix();
if (applyRotation != 0) {
+ if (applyRotation % 90 != 0) {
+ LOGGER.w("Rotation of %d % 90 != 0", applyRotation);
+ }
+
// Translate so center of image is at origin.
matrix.postTranslate(-srcWidth / 2.0f, -srcHeight / 2.0f);
diff --git a/tensorflow/examples/android/src/org/tensorflow/demo/tracking/MultiBoxTracker.java b/tensorflow/examples/android/src/org/tensorflow/demo/tracking/MultiBoxTracker.java
index aae0a4b62a..2fe2ba539e 100644
--- a/tensorflow/examples/android/src/org/tensorflow/demo/tracking/MultiBoxTracker.java
+++ b/tensorflow/examples/android/src/org/tensorflow/demo/tracking/MultiBoxTracker.java
@@ -161,15 +161,16 @@ public class MultiBoxTracker {
}
public synchronized void draw(final Canvas canvas) {
- // TODO(andrewharp): This may not work for non-90 deg rotations.
+ final boolean rotated = sensorOrientation % 180 == 90;
final float multiplier =
- Math.min(canvas.getWidth() / (float) frameHeight, canvas.getHeight() / (float) frameWidth);
+ Math.min(canvas.getHeight() / (float) (rotated ? frameWidth : frameHeight),
+ canvas.getWidth() / (float) (rotated ? frameHeight : frameWidth));
frameToCanvasMatrix =
ImageUtils.getTransformationMatrix(
frameWidth,
frameHeight,
- (int) (multiplier * frameHeight),
- (int) (multiplier * frameWidth),
+ (int) (multiplier * (rotated ? frameHeight : frameWidth)),
+ (int) (multiplier * (rotated ? frameWidth : frameHeight)),
sensorOrientation,
false);
for (final TrackedRecognition recognition : trackedObjects) {