首页 文章

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

提问于
浏览
1

我正在开发一个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度 .

这里有两个图像显示问题 .
first step

second step

1 回答

  • 0

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

    另一种方法是使用 OrientationEventListener :看到旋转手机快速180度,相机预览颠倒

相关问题