提交 e1eae197 编写于 作者: A Andrew Harp 提交者: TensorFlower Gardener

Android: add debug-specific overlay for detection activity that can be...

Android: add debug-specific overlay for detection activity that can be rendered on a different schedule from tracking overlay, improving performance
Change: 143575879
上级 d7b1d0a1
......@@ -30,7 +30,7 @@
android:layout_alignParentTop="true" />
<org.tensorflow.demo.OverlayView
android:id="@+id/overlay"
android:id="@+id/overlay_debug"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true" />
......
......@@ -23,8 +23,12 @@
android:layout_height="wrap_content"/>
<org.tensorflow.demo.OverlayView
android:id="@+id/overlay"
android:id="@+id/tracking_overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<org.tensorflow.demo.OverlayView
android:id="@+id/debug_overlay"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
......@@ -184,20 +184,20 @@ public abstract class CameraActivity extends Activity implements OnImageAvailabl
}
public void requestRender() {
final OverlayView overlay = (OverlayView) findViewById(R.id.overlay);
final OverlayView overlay = (OverlayView) findViewById(R.id.debug_overlay);
if (overlay != null) {
overlay.postInvalidate();
}
}
public void addCallback(final OverlayView.DrawCallback callback) {
final OverlayView overlay = (OverlayView) findViewById(R.id.overlay);
final OverlayView overlay = (OverlayView) findViewById(R.id.debug_overlay);
if (overlay != null) {
overlay.addCallback(callback);
}
}
public void onSetDebug(boolean debug) {}
public void onSetDebug(final boolean debug) {}
@Override
public boolean onKeyDown(final int keyCode, final KeyEvent event) {
......
......@@ -155,50 +155,63 @@ public class DetectorActivity extends CameraActivity implements OnImageAvailable
frameToCropTransform.invert(cropToFrameTransform);
yuvBytes = new byte[3][];
addCallback(
trackingOverlay = (OverlayView) findViewById(R.id.tracking_overlay);
trackingOverlay.addCallback(
new DrawCallback() {
@Override
public void drawCallback(final Canvas canvas) {
final Bitmap copy = cropCopyBitmap;
tracker.draw(canvas);
if (isDebug()) {
tracker.drawDebug(canvas);
}
}
});
addCallback(
new DrawCallback() {
@Override
public void drawCallback(final Canvas canvas) {
if (!isDebug()) {
return;
}
final Bitmap copy = cropCopyBitmap;
if (copy == null) {
return;
}
tracker.drawDebug(canvas);
if (copy != null) {
final Matrix matrix = new Matrix();
final float scaleFactor = 2;
matrix.postScale(scaleFactor, scaleFactor);
matrix.postTranslate(
canvas.getWidth() - copy.getWidth() * scaleFactor,
canvas.getHeight() - copy.getHeight() * scaleFactor);
canvas.drawBitmap(copy, matrix, new Paint());
final Vector<String> lines = new Vector<String>();
if (detector != null) {
String statString = detector.getStatString();
String[] statLines = statString.split("\n");
for (String line : statLines) {
lines.add(line);
}
final int backgroundColor = Color.argb(100, 0, 0, 0);
canvas.drawColor(backgroundColor);
final Matrix matrix = new Matrix();
final float scaleFactor = 2;
matrix.postScale(scaleFactor, scaleFactor);
matrix.postTranslate(
canvas.getWidth() - copy.getWidth() * scaleFactor,
canvas.getHeight() - copy.getHeight() * scaleFactor);
canvas.drawBitmap(copy, matrix, new Paint());
final Vector<String> lines = new Vector<String>();
if (detector != null) {
final String statString = detector.getStatString();
final String[] statLines = statString.split("\n");
for (final String line : statLines) {
lines.add(line);
}
}
lines.add("");
lines.add("Frame: " + previewWidth + "x" + previewHeight);
lines.add("Crop: " + copy.getWidth() + "x" + copy.getHeight());
lines.add("View: " + canvas.getWidth() + "x" + canvas.getHeight());
lines.add("Rotation: " + sensorOrientation);
lines.add("Inference time: " + lastProcessingTimeMs + "ms");
lines.add("Frame: " + previewWidth + "x" + previewHeight);
lines.add("Crop: " + copy.getWidth() + "x" + copy.getHeight());
lines.add("View: " + canvas.getWidth() + "x" + canvas.getHeight());
lines.add("Rotation: " + sensorOrientation);
lines.add("Inference time: " + lastProcessingTimeMs + "ms");
borderedText.drawLines(canvas, 10, canvas.getHeight() - 10, lines);
}
borderedText.drawLines(canvas, 10, canvas.getHeight() - 10, lines);
}
});
}
OverlayView trackingOverlay;
@Override
public void onImageAvailable(final ImageReader reader) {
Image image = null;
......@@ -225,8 +238,7 @@ public class DetectorActivity extends CameraActivity implements OnImageAvailable
sensorOrientation,
yuvBytes[0],
timestamp);
requestRender();
trackingOverlay.postInvalidate();
// No mutex needed as this method is not reentrant.
if (computing) {
......@@ -304,6 +316,7 @@ public class DetectorActivity extends CameraActivity implements OnImageAvailable
}
tracker.trackResults(mappedRecognitions, luminance, currTimestamp);
trackingOverlay.postInvalidate();
requestRender();
computing = false;
......@@ -324,7 +337,7 @@ public class DetectorActivity extends CameraActivity implements OnImageAvailable
}
@Override
public void onSetDebug(boolean debug) {
public void onSetDebug(final boolean debug) {
detector.enableStatLogging(debug);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册