簡體   English   中英

使用OpenCV在Android中拍攝相機屏幕方向的問題

[英]Issue of Camera-Screen Orientation in Android, using OpenCV

我正在開發一個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方法中使用flip方法或旋轉矩陣,這樣我的性能會變差)。

唯一的問題是,我的設備方向從橫向向右更改為橫向,反之亦然,而沒有通過縱向模式。 更改之后,我的相機相對於自然位置旋轉了180度。

這里有兩個顯示問題的圖像。 第一步第二步

此180°旋轉問題是Android平台的錯誤或功能。 一種明顯的解決方法是聲明您的活動僅使用一種風景和一種肖像方向(而不是全傳感器)。

另一種方法是使用OrientationEventListener :請參閱將

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM