[Bug Fix] fix camera preview size setting problem (#638)

* [Bug Fix] fix android app detail page errors

* [Android] fix realtime camera mode and shutter

* [Bug Fix] fix AllocateSegmentationResultFromJava error

* [Bug Fix] fix camera preview size setting problem

* [Model] use uint8 buffer instead of fp32 in ppseg postprocess

* [Model] revert changes in ppseg

* [Model] revert postprocess changes in ppseg
This commit is contained in:
DefTruth
2022-11-21 10:52:11 +08:00
committed by GitHub
parent 79620c876a
commit 10ac610df6
6 changed files with 48 additions and 30 deletions

View File

@@ -15,14 +15,14 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".facedet.FaceDetMainActivity">
<activity android:name=".segmentation.SegmentationMainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name=".facedet.FaceDetSettingsActivity"
android:name=".segmentation.SegmentationSettingsActivity"
android:label="Settings">
</activity>
</application>

View File

@@ -320,8 +320,13 @@ public class FaceDetMainActivity extends Activity implements View.OnClickListene
public void initView() {
TYPE = REALTIME_DETECT;
CameraSurfaceView.EXPECTED_PREVIEW_WIDTH = 720;
CameraSurfaceView.EXPECTED_PREVIEW_HEIGHT = 360;
// (1) EXPECTED_PREVIEW_WIDTH should mean 'height' and EXPECTED_PREVIEW_HEIGHT
// should mean 'width' if the camera display orientation is 90 | 270 degree
// (Hold the phone upright to record video)
// (2) Smaller resolution is more suitable for lite face detection
// on mobile phone. So, we set this preview size (480,480) here.
CameraSurfaceView.EXPECTED_PREVIEW_WIDTH = 480;
CameraSurfaceView.EXPECTED_PREVIEW_HEIGHT = 480;
svPreview = (CameraSurfaceView) findViewById(R.id.sv_preview);
svPreview.setOnTextureChangedListener(this);
svPreview.switchCamera(); // Front camera for HumanSeg

View File

@@ -310,8 +310,13 @@ public class SegmentationMainActivity extends Activity implements View.OnClickLi
public void initView() {
TYPE = REALTIME_DETECT;
CameraSurfaceView.EXPECTED_PREVIEW_WIDTH = 720;
CameraSurfaceView.EXPECTED_PREVIEW_HEIGHT = 360;
// (1) EXPECTED_PREVIEW_WIDTH should mean 'height' and EXPECTED_PREVIEW_HEIGHT
// should mean 'width' if the camera display orientation is 90 | 270 degree
// (Hold the phone upright to record video)
// (2) Smaller resolution is more suitable for Lite Portrait HumanSeg.
// So, we set this preview size (480,480) here.
CameraSurfaceView.EXPECTED_PREVIEW_WIDTH = 480;
CameraSurfaceView.EXPECTED_PREVIEW_HEIGHT = 480;
svPreview = (CameraSurfaceView) findViewById(R.id.sv_preview);
svPreview.setOnTextureChangedListener(this);
svPreview.switchCamera(); // Front camera for HumanSeg

View File

@@ -126,7 +126,7 @@ public class Utils {
}
public static Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
final double ASPECT_TOLERANCE = 0.3;
double targetRatio = (double) w / h;
if (sizes == null) return null;

View File

@@ -30,8 +30,8 @@ public class CameraSurfaceView extends GLSurfaceView implements Renderer,
SurfaceTexture.OnFrameAvailableListener {
private static final String TAG = CameraSurfaceView.class.getSimpleName();
public static int EXPECTED_PREVIEW_WIDTH = 1280;
public static int EXPECTED_PREVIEW_HEIGHT = 720;
public static int EXPECTED_PREVIEW_WIDTH = 1280; // 1920
public static int EXPECTED_PREVIEW_HEIGHT = 720; // 960
protected int numberOfCameras;
protected int selectedCameraId;
@@ -99,6 +99,16 @@ public class CameraSurfaceView extends GLSurfaceView implements Renderer,
private int vcTex2Screen;
private int tcTex2Screen;
public void setBitmapReleaseMode(boolean mode) {
synchronized (this) {
bitmapReleaseMode = mode;
}
}
public Bitmap getBitmap() {
return ARGB8888ImageBitmap; // may null or recycled.
}
public interface OnTextureChangedListener {
boolean onTextureChanged(Bitmap ARGB8888ImageBitmap);
}
@@ -236,16 +246,6 @@ public class CameraSurfaceView extends GLSurfaceView implements Renderer,
GLES20.glFlush();
}
public void setBitmapReleaseMode(boolean mode) {
synchronized (this) {
bitmapReleaseMode = mode;
}
}
public Bitmap getBitmap() {
return ARGB8888ImageBitmap; // may null or recycled.
}
private float[] transformTextureCoordinates(float[] coords, float[] matrix) {
float[] result = new float[coords.length];
float[] vt = new float[4];
@@ -287,20 +287,28 @@ public class CameraSurfaceView extends GLSurfaceView implements Renderer,
public void openCamera() {
if (disableCamera) return;
camera = Camera.open(selectedCameraId);
List<Size> supportedPreviewSizes = camera.getParameters().getSupportedPreviewSizes();
Size previewSize = Utils.getOptimalPreviewSize(supportedPreviewSizes, EXPECTED_PREVIEW_WIDTH,
EXPECTED_PREVIEW_HEIGHT);
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(previewSize.width, previewSize.height);
if (parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
}
camera.setParameters(parameters);
int degree = Utils.getCameraDisplayOrientation(context, selectedCameraId);
camera.setDisplayOrientation(degree);
boolean rotate = degree == 90 || degree == 270;
textureWidth = rotate ? previewSize.height : previewSize.width;
textureHeight = rotate ? previewSize.width : previewSize.height;
int adjusted_width = rotate ? EXPECTED_PREVIEW_HEIGHT : EXPECTED_PREVIEW_WIDTH;
int adjusted_height = rotate ? EXPECTED_PREVIEW_WIDTH : EXPECTED_PREVIEW_HEIGHT;
List<Size> supportedPreviewSizes = camera.getParameters().getSupportedPreviewSizes();
Size previewSize = Utils.getOptimalPreviewSize(
supportedPreviewSizes, adjusted_width, adjusted_height);
textureWidth = previewSize.width;
textureHeight = previewSize.height;
parameters.setPreviewSize(previewSize.width, previewSize.height);
camera.setParameters(parameters);
if (parameters.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
}
// Destroy FBO and draw textures
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
GLES20.glDeleteFramebuffers(1, fbo, 0);