onPreviewFrame возвращаемое изображение повернуто на 180 градусов на некоторых устройствах - PullRequest
0 голосов
/ 26 августа 2018

Поскольку я работаю над приложением Android с минимальным уровнем API 16. Мне нужно создать свой собственный Camera Builder для живых кадров и обработать их для распознавания текста. Я установил вид поверхности и добавил обратный вызов для предварительного просмотра, чтобы я мог работать вживую.кадры в onPreviewFrame (byte [] bytes, Camera camera) Method.

По умолчанию экран работает в альбомной ориентации, и на большинстве устройств я получаю правильную ориентацию. Но в некоторых устройствах я получаю изображение, повернутое на 180 градусов в этом методе , и не смог обработать.

Display display = ((WindowManager) Objects.requireNonNull(context.getSystemService(WINDOW_SERVICE))).getDefaultDisplay();
return display.getRotation();

Приведенный выше метод возвращает поворот на 90 градусов в обоих устройствах.Но, с одной стороны, изображение имеет правильную ориентацию, а с другой - изображение поворачивается на 180 градусов.Вот класс камеры:

public abstract class Camera {

    private static android.hardware.Camera mCamera;


/**
 * A safe way to get an instance of the Camera object.
 */


private static android.hardware.Camera getCameraInstance(int cameraFacing) {
    android.hardware.Camera c = null;
    try {
        c = android.hardware.Camera.open(cameraFacing); // attempt to get a Camera instance
    } catch (Exception e) {
        // Camera is not available (in use or does not exist)
    }
    return c; // returns null if camera is unavailable
}


public static void closeCamera() {
    if (mCamera != null) {
        mCamera.release();
        mCamera = null;
    }

}

public static void autoFocus() {
    if (mCamera != null)
        try {
            mCamera.autoFocus(null);
        } catch (Exception ignored) {

        }
}


/**
 * focusMode: android.hardware.Camera.Parameters
 * cameraFacing: android.hardware.Camera.CameraInfo.FACING_FRONT or FACING_BACK
 */
public static class CameraBuilder {
    private static final String TAG = CameraBuilder.class.getSimpleName();
    private String focusMode = android.hardware.Camera.Parameters.FOCUS_MODE_AUTO;
    private int cameraFacing = android.hardware.Camera.CameraInfo.CAMERA_FACING_BACK;
    private int displayOrientation = 0;

    public CameraBuilder() {

    }

    /**
     * @param focusMode default: android.hardware.Camera.Parameters.FOCUS_MODE_AUTO
     * @return CameraBuilder
     */
    public CameraBuilder setFocusMode(String focusMode) {
        this.focusMode = focusMode;
        return this;
    }

    /**
     * @param cameraFacing default : android.hardware.Camera.CameraInfo.CAMERA_FACING_BACK
     * @return CameraBuilder
     */
    public CameraBuilder setCameraFacing(int cameraFacing) {
        this.cameraFacing = cameraFacing;
        return this;
    }


    public CameraBuilder setDisplayOrientation(int orientation) {
        this.displayOrientation = orientation;
        return this;
    }

    public android.hardware.Camera build() {
        try {
            mCamera = getCameraInstance(cameraFacing);
            android.hardware.Camera.Parameters params = mCamera.getParameters();
            params.setFocusMode(focusMode);
            mCamera.setParameters(params);

        } catch (Exception e) {
            // Camera is not available (in use or does not exist)
            Log.e(TAG, "Camera Exception: " + e.getMessage());
        }
        mCamera.setDisplayOrientation(displayOrientation);
        return mCamera;
    }

}

}

Вот инициализация моей камеры.

camera = new CameraBuilder()
           .setCameraFacing(Camera.CameraInfo.CAMERA_FACING_BACK)
           .setFocusMode(android.hardware.Camera.Parameters.FOCUS_MODE_AUTO)
           .setDisplayOrientation(0)
           .build();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...