使用OpenCV在Android中发布相机屏幕方向

时间:2014-10-19 09:58:04

标签: android opencv camera

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

我使用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度。

这里有两张显示问题的图片。 first step second step

1 个答案:

答案 0 :(得分:0)

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

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