android: JavaCamera2View use calculateCameraFrameSize() method

from CameraBridgeViewBase (common base with JavaCameraView)
pull/14981/head
Alexander Alekhin 5 years ago
parent 57fae4a6a1
commit 3998b41d68
  1. 39
      modules/java/generator/android-21/java/org/opencv/android/JavaCamera2View.java
  2. 10
      modules/java/generator/android/java/org/opencv/android/CameraBridgeViewBase.java

@ -2,6 +2,7 @@ package org.opencv.android;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
import android.annotation.TargetApi; import android.annotation.TargetApi;
import android.content.Context; import android.content.Context;
@ -24,6 +25,7 @@ import android.view.ViewGroup.LayoutParams;
import org.opencv.core.CvType; import org.opencv.core.CvType;
import org.opencv.core.Mat; import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc; import org.opencv.imgproc.Imgproc;
/** /**
@ -248,6 +250,20 @@ public class JavaCamera2View extends CameraBridgeViewBase {
} }
} }
public static class JavaCameraSizeAccessor implements ListItemAccessor {
@Override
public int getWidth(Object obj) {
android.util.Size size = (android.util.Size)obj;
return size.getWidth();
}
@Override
public int getHeight(Object obj) {
android.util.Size size = (android.util.Size)obj;
return size.getHeight();
}
}
boolean calcPreviewSize(final int width, final int height) { boolean calcPreviewSize(final int width, final int height) {
Log.i(LOGTAG, "calcPreviewSize: " + width + "x" + height); Log.i(LOGTAG, "calcPreviewSize: " + width + "x" + height);
if (mCameraID == null) { if (mCameraID == null) {
@ -258,26 +274,15 @@ public class JavaCamera2View extends CameraBridgeViewBase {
try { try {
CameraCharacteristics characteristics = manager.getCameraCharacteristics(mCameraID); CameraCharacteristics characteristics = manager.getCameraCharacteristics(mCameraID);
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
int bestWidth = 0, bestHeight = 0;
float aspect = (float) width / height;
android.util.Size[] sizes = map.getOutputSizes(ImageReader.class); android.util.Size[] sizes = map.getOutputSizes(ImageReader.class);
bestWidth = sizes[0].getWidth(); List<android.util.Size> sizes_list = Arrays.asList(sizes);
bestHeight = sizes[0].getHeight(); Size frameSize = calculateCameraFrameSize(sizes_list, new JavaCameraSizeAccessor(), width, height);
for (android.util.Size sz : sizes) { Log.i(LOGTAG, "Selected preview size to " + Integer.valueOf((int)frameSize.width) + "x" + Integer.valueOf((int)frameSize.height));
int w = sz.getWidth(), h = sz.getHeight(); assert(!(frameSize.width == 0 || frameSize.height == 0));
Log.d(LOGTAG, "trying size: " + w + "x" + h); if (mPreviewSize.getWidth() == frameSize.width && mPreviewSize.getHeight() == frameSize.height)
if (width >= w && height >= h && bestWidth <= w && bestHeight <= h
&& Math.abs(aspect - (float) w / h) < 0.2) {
bestWidth = w;
bestHeight = h;
}
}
Log.i(LOGTAG, "best size: " + bestWidth + "x" + bestHeight);
assert(!(bestWidth == 0 || bestHeight == 0));
if (mPreviewSize.getWidth() == bestWidth && mPreviewSize.getHeight() == bestHeight)
return false; return false;
else { else {
mPreviewSize = new android.util.Size(bestWidth, bestHeight); mPreviewSize = new android.util.Size((int)frameSize.width, (int)frameSize.height);
return true; return true;
} }
} catch (CameraAccessException e) { } catch (CameraAccessException e) {

@ -30,7 +30,7 @@ import android.view.SurfaceView;
public abstract class CameraBridgeViewBase extends SurfaceView implements SurfaceHolder.Callback { public abstract class CameraBridgeViewBase extends SurfaceView implements SurfaceHolder.Callback {
private static final String TAG = "CameraBridge"; private static final String TAG = "CameraBridge";
private static final int MAX_UNSPECIFIED = -1; protected static final int MAX_UNSPECIFIED = -1;
private static final int STOPPED = 0; private static final int STOPPED = 0;
private static final int STARTED = 1; private static final int STARTED = 1;
@ -481,6 +481,7 @@ public abstract class CameraBridgeViewBase extends SurfaceView implements Surfac
for (Object size : supportedSizes) { for (Object size : supportedSizes) {
int width = accessor.getWidth(size); int width = accessor.getWidth(size);
int height = accessor.getHeight(size); int height = accessor.getHeight(size);
Log.d(TAG, "trying size: " + width + "x" + height);
if (width <= maxAllowedWidth && height <= maxAllowedHeight) { if (width <= maxAllowedWidth && height <= maxAllowedHeight) {
if (width >= calcWidth && height >= calcHeight) { if (width >= calcWidth && height >= calcHeight) {
@ -489,6 +490,13 @@ public abstract class CameraBridgeViewBase extends SurfaceView implements Surfac
} }
} }
} }
if ((calcWidth == 0 || calcHeight == 0) && supportedSizes.size() > 0)
{
Log.i(TAG, "fallback to the first frame size");
Object size = supportedSizes.get(0);
calcWidth = accessor.getWidth(size);
calcHeight = accessor.getHeight(size);
}
return new Size(calcWidth, calcHeight); return new Size(calcWidth, calcHeight);
} }

Loading…
Cancel
Save