【问题标题】:Issue of Camera-Screen Orientation in Android, using OpenCVAndroid中的相机屏幕方向问题,使用OpenCV
【发布时间】:2014-10-20 11:42:54
【问题描述】:

我正在开发一个 Android 应用程序,我在开发中使用的是 OpenCV4Android,版本为 2.4.9。

我使用 JavaCameraView 类打开了一个视频流。我的问题是与设备的位置相比,相机的方向不好。我使用的是三星 Galaxy S4,OpenCV 摄像头的默认方向似乎是向左横向。

为了解决这个问题,我使用了这个解决方案。我扩展了 JavaCameraView 类,在新类中添加了以下方法:

private void getScreenRotationOnPhone() {

    final Display display = ((WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

    switch (display.getRotation()) {
        case Surface.ROTATION_0:
            System.out.println("SCREEN_ORIENTATION_PORTRAIT");
            setDisplayOrientation(mCamera, 90);
            try {
                mCamera.setPreviewDisplay(getHolder());
            } catch (IOException e) {
                e.printStackTrace();
            }
            break;

        case Surface.ROTATION_90:
            System.out.println("SCREEN_ORIENTATION_LANDSCAPE");
            break;

        case Surface.ROTATION_180:
            System.out.println("SCREEN_ORIENTATION_REVERSE_PORTRAIT");
            break;

        case Surface.ROTATION_270:
            System.out.println("SCREEN_ORIENTATION_REVERSE_LANDSCAPE");
            setDisplayOrientation(mCamera, 180);
            try {
                mCamera.setPreviewDisplay(getHolder());
            } catch (IOException e) {
                e.printStackTrace();
            }
            break;
    }
}

private void getScreenRotationOnTablet() {

    final Display display = ((WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

    switch (display.getRotation()) {
        case Surface.ROTATION_0:
            System.out.println("SCREEN_ORIENTATION_LANDSCAPE");
            break;

        case Surface.ROTATION_90:
            System.out.println("SCREEN_ORIENTATION_REVERSE_PORTRAIT");
            break;

        case Surface.ROTATION_180:
            System.out.println("SCREEN_ORIENTATION_REVERSE_LANDSCAPE");
            break;

        case Surface.ROTATION_270:
            System.out.println("SCREEN_ORIENTATION_PORTRAIT");
            break;
    }
}

public static boolean isTablet(Context ctx){
    return (ctx.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}

所以,在 initializeCamera 方法中,在 mCamera.startPreview() 之前,我添加了以下代码:

                if(isTablet(getContext()) == Boolean.FALSE){
                    this.getScreenRotationOnPhone();
                }else{
                   this.getScreenRotationOnTablet();
                }

此代码有效,并且应用程序没有变慢(我也可以在我的活动的 onCameraFrame 方法中使用翻转方法或旋转矩阵,这样我的性能会变差)。

唯一的问题是当我的设备方向从横向向右变为横向向左时,反之亦然,而无需通过纵向模式。更改后,我的相机相对于自然位置旋转了 180 度。

这里有两张图片显示了问题。

【问题讨论】:

    标签: android opencv camera


    【解决方案1】:

    这个 180° 旋转问题是 Android 平台的错误或功能。一种明显的解决方法是声明您的活动仅使用一种横向和一种纵向(不是全传感器)。

    另一种方法是使用OrientationEventListener:见Rotating phone quickly 180 degrees, camera preview turns upside down

    【讨论】:

      猜你喜欢
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 2012-11-09
      • 1970-01-01
      • 2023-04-02
      相关资源
      最近更新 更多